Skip to content
This repository was archived by the owner on Dec 5, 2023. It is now read-only.

Commit 0dc6e57

Browse files
committed
Limit gateway language field on language form to gateway languages (#655)
* Limit gateway language field on language form to gateway languages When selecting a language's gateway language, we only want to show gateway languages instead of all languages. Filtering out other languages also will help avoid a situation where a temporary language has another (unapproved) temporary language as its gateway language. * Add unit tests for gateway language autocomplete
1 parent a58a743 commit 0dc6e57

File tree

6 files changed

+98
-2
lines changed

6 files changed

+98
-2
lines changed

td/forms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def __init__(self, *args, **kwargs):
9595
widget=forms.TextInput(
9696
attrs={
9797
"class": "language-selector",
98-
"data-source-url": reverse("names_autocomplete")
98+
"data-source-url": reverse("gateway_languages")
9999
}
100100
),
101101
required=False

td/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,10 @@ def names_data(cls, short=False):
453453
gw=x.gateway_flag, ld=x.get_direction_display()))
454454
return data
455455

456+
@classmethod
457+
def get_gateway_languages(cls):
458+
return [dict(pk=x.pk, lc=x.lc, ln=x.ln, ang=x.ang, lr=x.lr) for x in cls.objects.filter(gateway_flag=True)]
459+
456460

457461
class EAVBase(models.Model):
458462
attribute = models.CharField(max_length=100)

td/tests/test_models.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,17 @@ def test_tag_tip_w_alt_name(self):
375375
expected_result = ", ".join([alt_1.name, alt_2.name])
376376
self.assertEqual(self.lang.tag_tip, expected_result)
377377

378+
def test_get_gateway_languages(self):
379+
other_language = Language.objects.create(code="ol", iso_639_3="tol", name="Test Other Language",
380+
gateway_flag=False)
381+
result = Language.get_gateway_languages()
382+
expected_gateway_language = dict(pk=self.lang.pk, lc=self.lang.lc, ln=self.lang.ln, ang=self.lang.ang,
383+
lr=self.lang.lr)
384+
expected_other_language = dict(pk=other_language.pk, lc=other_language.lc, ln=other_language.ln,
385+
ang=other_language.ang, lr=other_language.lr)
386+
self.assertIn(expected_gateway_language, result)
387+
self.assertNotIn(expected_other_language, result)
388+
378389

379390
class CountryTestCase(TestCase):
380391

td/tests/test_views.py

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import re
55
import types
66
import requests
7+
import json
8+
from absoluteuri import reverse
79

810
from mock import patch, Mock
911

@@ -18,7 +20,7 @@
1820
from ..resources.models import Questionnaire
1921
from ..views import TempLanguageListView, TempLanguageDetailView, TempLanguageUpdateView, AjaxTemporaryCode,\
2022
TempLanguageAdminView, TempLanguageWizardView, LanguageDetailView, codes_text_export, names_text_export,\
21-
names_json_export
23+
names_json_export, gateway_languages_autocomplete
2224
from ..forms import TempLanguageForm
2325
from ..tests.models import NoSignalTestCase
2426

@@ -308,3 +310,53 @@ def test_get_context_data(self):
308310
TempLanguage.objects.create(pk=999, code="abc")
309311
returned = self.view.get_context_data()
310312
self.assertIn("pending", returned)
313+
314+
315+
class GatewayLanguagesAutocompleteTestCase(TestCase):
316+
def setUp(self):
317+
self.request = RequestFactory().get(reverse("gateway_languages"))
318+
self.ol = Language.objects.create(code="ol", iso_639_3="tol", name="Test Other Language",
319+
gateway_flag=False)
320+
self.gl = Language.objects.create(code="gl", iso_639_3="tgl", name="Test Gateway Language",
321+
gateway_flag=True)
322+
323+
def test_returns_json(self):
324+
"""
325+
Must return JsonResponse with results, count, and term
326+
"""
327+
response = gateway_languages_autocomplete(self.request)
328+
self.assertIsInstance(response, JsonResponse)
329+
self.assertIn("results", response.content)
330+
self.assertIn("count", response.content)
331+
self.assertIn("term", response.content)
332+
333+
@patch("td.views.Language.get_gateway_languages")
334+
def test_call_get_gateway_languages(self, mock_get_gateway_languages):
335+
gateway_languages_autocomplete(self.request)
336+
mock_get_gateway_languages.assert_called_once_with()
337+
338+
def test_search_other_language(self):
339+
"""
340+
Should not return any languages
341+
"""
342+
term = "ol"
343+
expected_results = []
344+
request = RequestFactory().get("/ac/gateway-langnames/?q=" + term)
345+
response = gateway_languages_autocomplete(request)
346+
data = json.loads(response.content)
347+
self.assertListEqual(data.get("results"), expected_results)
348+
self.assertEqual(data.get("term"), "ol")
349+
self.assertEqual(data.get("count"), 0)
350+
351+
def test_search_gateway_language(self):
352+
"""
353+
Should return one gateway language
354+
"""
355+
term = "gl"
356+
expected_results = [dict(pk=self.gl.pk, lc=self.gl.lc, ln=self.gl.ln, lr=self.gl.lr, ang=self.gl.ang)]
357+
request = RequestFactory().get("/ac/gateway-langnames/?q=" + term)
358+
response = gateway_languages_autocomplete(request)
359+
data = json.loads(response.content)
360+
self.assertListEqual(data.get("results"), expected_results)
361+
self.assertEqual(data.get("term"), term)
362+
self.assertEqual(data.get("count"), 1)

td/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
names_json_export,
2626
export_svg,
2727
languages_autocomplete,
28+
gateway_languages_autocomplete,
2829
)
2930

3031
urlpatterns = [
@@ -64,6 +65,7 @@
6465
url(r"^ajax/data-sources/imb/peoplegroups/$", AjaxIMBPeopleGroupListView.as_view(), name="ajax_ds_imb_peoplegroups"),
6566

6667
url(r"^ac/langnames/", languages_autocomplete, name="names_autocomplete"),
68+
url(r"^ac/gateway-langnames/", gateway_languages_autocomplete, name="gateway_languages")
6769
]
6870

6971
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

td/views.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,33 @@ def languages_autocomplete(request):
112112
return JsonResponse({"results": d, "count": len(d), "term": term})
113113

114114

115+
# TODO: Like languages_autocomplete() but only for gateway languages. Candidate for refactor.
116+
def gateway_languages_autocomplete(request):
117+
term = request.GET.get("q", "")
118+
data = Language.get_gateway_languages()
119+
d = []
120+
term = term.lower().encode("utf-8")
121+
if len(term) <= 3:
122+
# search: lc
123+
# first do a *starts with* style search of language code (lc)
124+
d.extend([
125+
x
126+
for x in data
127+
if term == x["lc"].lower()[:len(term)]
128+
])
129+
if len(term) >= 3:
130+
# search: lc, ln, lr, ang
131+
d.extend([
132+
x
133+
for x in data
134+
if (
135+
term in x["lc"] or term in x["ln"].lower() or
136+
term in x["ang"].lower() or term in x["lr"].lower()
137+
)
138+
])
139+
return JsonResponse({"results": d, "count": len(d), "term": term})
140+
141+
115142
class AdditionalLanguageListView(TemplateView):
116143
template_name = "td/additionallanguage_list.html"
117144

0 commit comments

Comments
 (0)