Skip to content

Searchbox bugfix #489

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 17 commits into from
Apr 2, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
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
4 changes: 2 additions & 2 deletions oioioi/problems/fixtures/test_problem_search.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@
"pk": 3,
"model": "problems.problem",
"fields": {
"legacy_name": "Znacznik",
"ascii_name": "Znacznik",
"legacy_name": "Znaczn1k",
"ascii_name": "Znaczn1k",
"short_name": "zna1",
"visibility": "PU"
}
Expand Down
4 changes: 2 additions & 2 deletions oioioi/problems/static/common/tag_selection.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,10 +116,10 @@ function init_search_selection(id) {
} else if (item.trigger !== 'problem') {
// At this point for anything other than a problem we
// want to create a search tag
const value = item.value || item.name;
const value = item.value;

// Only create new search tag if it doesn't exist yet
const tag = $(".search-tag-text:contains('" + value + "')");
const tag = $("input[name='" + item.prefix + "'][value='" + value + "']");
if (tag.length === 0) {
const tag = value.split('_')[0];

Expand Down
9 changes: 5 additions & 4 deletions oioioi/problems/templates/problems/problemset/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -62,25 +62,26 @@
</span>
</div>
<div id="tag-row">
{% if show_tags %}
{% with delete_me="this.parentNode.parentNode.remove()" %}

{% include "problems/problemset/search-tag.html" with input_class="collapse" input_attr="disabled" %}
{% for tag in difficulty_tags %}
{% include "problems/problemset/search-tag.html" with input_name="difficulty" input_text=tag.full_name input_attr="readonly" input_script=delete_me %}
{% include "problems/problemset/search-tag.html" with input_name="difficulty" input_value=tag input_text=tag.full_name input_attr="readonly" input_script=delete_me %}
{% endfor %}
{% for tag in algorithm_tags %}
{% include "problems/problemset/search-tag.html" with input_name="algorithm" input_text=tag input_attr="readonly" input_script=delete_me %}
{% include "problems/problemset/search-tag.html" with input_name="algorithm" input_value=tag input_text=tag input_attr="readonly" input_script=delete_me %}
{% endfor %}
{% for tag, origininfo in origin_tags.items %}
<div id="origintag-group-{{ tag }}" class="origintag-group">
{% include "problems/problemset/search-tag.html" with input_name="origin" input_text=tag input_attr="readonly" input_script="this.parentNode.parentNode.parentNode.remove()" %}
{% include "problems/problemset/search-tag.html" with input_name="origin" input_value=tag input_text=tag input_attr="readonly" input_script="this.parentNode.parentNode.parentNode.remove()" %}
{% for info in origininfo %}
{% include "problems/problemset/search-tag.html" with input_name="origin" input_value=tag|add:"_"|add:info input_text=info input_attr="readonly" input_script=delete_me %}
{% endfor %}
</div>
{% endfor %}

{% endwith %}
{% endif %}
</div>
</form>
{% endif %}
Expand Down
7 changes: 4 additions & 3 deletions oioioi/problems/tests/test_problem.py
Original file line number Diff line number Diff line change
Expand Up @@ -740,14 +740,15 @@ def test_search_permissions_all(self):
self.assert_contains_only(response, self.task_names)


@override_settings(PROBLEM_TAGS_VISIBLE=True)
class TestProblemSearch(TestCase, AssertContainsOnlyMixin):
fixtures = ['test_problem_search']
url = reverse('problemset_main')
task_names = all_values = [
'Prywatne',
'Zadanko',
'Żółć',
'Znacznik',
'Znaczn1k',
'Algorytm',
'Trudność',
'Bajtocja',
Expand Down Expand Up @@ -797,7 +798,7 @@ def test_search_name_multiple(self):
response = self.client.get(self.url, {'q': 'a'})
self.assertEqual(response.status_code, 200)
self.assert_contains_only(
response, ('Zadanko', 'Znacznik', 'Algorytm', 'Byteland')
response, ('Zadanko', 'Znaczn1k', 'Algorytm', 'Byteland')
)

def _test_search_name_localized(self, queries, exp_names):
Expand Down Expand Up @@ -833,7 +834,7 @@ def test_search_short_name_multiple(self):
self.client.get('/c/c/')
response = self.client.get(self.url, {'q': '1'})
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, ('Zadanko', 'Żółć', 'Znacznik'))
self.assert_contains_only(response, ('Zadanko', 'Żółć', 'Znaczn1k'))

def test_search_tags_basic(self):
self.client.get('/c/c/')
Expand Down
27 changes: 20 additions & 7 deletions oioioi/problems/tests/test_problem_statistics.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,13 +228,25 @@ def test_statistics_imported(self):
self.assertTrue(ps.avg_best_score == 100)


@override_settings(PROBLEM_STATISTICS_AVAILABLE=True)
@override_settings(
PROBLEM_STATISTICS_AVAILABLE=True,
PROBLEM_TAGS_VISIBLE=False,
)
class TestProblemStatisticsDisplay(TestCase):
fixtures = ['test_users', 'test_statistics_display']

problem_columns = [
problem_columns_tags_invisible = [
'short_name',
'name',
'submitted',
'solved_pc',
'avg_best_score',
'user_score',
]
problem_columns_tags_visible = [
'short_name',
'name',
'tags',
'submitted',
'solved_pc',
'avg_best_score',
Expand Down Expand Up @@ -315,7 +327,7 @@ def test_statistics_problem_list(self):
def test_statistics_sorting(self):
self.assertTrue(self.client.login(username='test_user'))

for i, column in enumerate(self.problem_columns):
for i, column in enumerate(self.problem_columns_tags_invisible):
url_main = reverse('problemset_main')
response = self.client.get(url_main, {'order_by': column})
self.assertEqual(response.status_code, 200)
Expand Down Expand Up @@ -344,7 +356,7 @@ def test_statistics_nulls(self):

self.assertTrue(self.client.login(username='test_user'))

for column in self.problem_columns[2:]:
for column in self.problem_columns_tags_invisible[2:]:
url_main = reverse('problemset_main')
response = self.client.get(url_main, {'order_by': column})
self.assertEqual(response.status_code, 200)
Expand All @@ -363,7 +375,7 @@ def test_statistics_sort_nulls(self):

self.assertTrue(self.client.login(username='test_user'))

for i, column in enumerate(self.problem_columns):
for i, column in enumerate(self.problem_columns_tags_invisible):
url_main = reverse('problemset_main')
response = self.client.get(url_main, {'order_by': column})
self.assertEqual(response.status_code, 200)
Expand All @@ -378,12 +390,13 @@ def test_statistics_sort_nulls(self):
self._assert_rows_sorted(rows, order_by=i, desc=True)

# Check that the query and the ordering are correctly preserved in links
@override_settings(PROBLEM_TAGS_VISIBLE=True)
def test_statistics_sorting_with_query(self):
self.assertTrue(self.client.login(username='test_user'))

col_no = 3
col_no = 4
q = 'Bbbb'
order = self.problem_columns[col_no - 1]
order = self.problem_columns_tags_visible[col_no - 1]
url_main = reverse('problemset_main')

response = self.client.get(
Expand Down
54 changes: 54 additions & 0 deletions oioioi/problems/tests/test_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ def test_algorithm_tag_label_view(self):
self.assertEqual(response.status_code, 404)


@override_settings(PROBLEM_TAGS_VISIBLE=True)
class TestProblemSearchOrigin(TestCase, AssertContainsOnlyMixin):
fixtures = ['test_problem_search_origin']
url = reverse('problemset_main')
Expand Down Expand Up @@ -127,6 +128,7 @@ def test_search_origininfovalue_multiple(self):
self.assert_contains_only(response, [])


@override_settings(PROBLEM_TAGS_VISIBLE=True)
class TestProblemSearchHintsTags(TestCase, AssertContainsOnlyMixin):
fixtures = [
'test_origin_tags',
Expand Down Expand Up @@ -159,6 +161,38 @@ class TestProblemSearchHintsTags(TestCase, AssertContainsOnlyMixin):
def get_query_url(self, parameters):
return self.url + '?' + urllib.parse.urlencode(parameters)

@override_settings(LANGUAGE_CODE="en", PROBLEM_TAGS_VISIBLE=False)
def test_search_no_hints_tags_basic(self):
self.client.get('/c/c/')

response = self.client.get(self.get_query_url({'q': 'najdłuższy'}))
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, [])

response = self.client.get(self.get_query_url({'q': 'easy'}))
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, [])

response = self.client.get(self.get_query_url({'q': 'Mediu'}))
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, [])

response = self.client.get(self.get_query_url({'q': 'PROGRA'}))
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, [])

response = self.client.get(self.get_query_url({'q': 'dYNAM'}))
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, [])

response = self.client.get(self.get_query_url({'q': 'dp'}))
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, [])

response = self.client.get(self.get_query_url({'q': 'increasing'}))
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, [])

@override_settings(LANGUAGE_CODE="en")
def test_search_hints_tags_basic(self):
self.client.get('/c/c/')
Expand Down Expand Up @@ -191,6 +225,26 @@ def test_search_hints_tags_basic(self):
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, ['lcis'])

@override_settings(LANGUAGE_CODE="en", PROBLEM_TAGS_VISIBLE=False)
def test_search_no_hints_origininfo(self):
self.client.get('/c/c/')
response = self.client.get(self.url, {'q': 'pa_'})
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, [])

response = self.client.get(self.url, {'q': '2011'})
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, [])

response = self.client.get(self.url, {'q': 'Round'})
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, [])

response = self.client.get(self.url, {'q': 'Potyczki Algorytmiczne'})
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, [])

@override_settings(LANGUAGE_CODE="en")
def test_search_hints_origininfo(self):
self.client.get('/c/c/')
response = self.client.get(self.url, {'q': 'pa_'})
Expand Down
13 changes: 9 additions & 4 deletions oioioi/problems/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,10 @@ def generate_problemset_tabs(request):


def problemset_get_problems(request):
problems = search_problems_in_problemset(request.GET)
if settings.PROBLEM_TAGS_VISIBLE:
problems = search_problems_in_problemset(request.GET)
else:
problems = Problem.objects.all()

if settings.PROBLEM_STATISTICS_AVAILABLE:
# We annotate all of the statistics to assure that the display
Expand Down Expand Up @@ -1181,9 +1184,11 @@ def get_search_hints_view(request, view_type):

result = []
result.extend(list(get_problem_hints(query, view_type, request.user)))
result.extend(get_algorithm_and_difficulty_tag_hints(query))
result.extend(get_nonselected_origintag_hints(query))
result.extend(get_origininfovalue_hints(query))

if settings.PROBLEM_TAGS_VISIBLE:
result.extend(get_algorithm_and_difficulty_tag_hints(query))
result.extend(get_nonselected_origintag_hints(query))
result.extend(get_origininfovalue_hints(query))

# Convert category names in results from lazy translation to strings,
# since jsonify throws error if given lazy translation objects.
Expand Down