Skip to content

Commit 9fb4e54

Browse files
Merge pull request #1840 from IFRCGo/feat/ifrc-translation-api-v2
Update logic for new translation API
2 parents 87c319d + b90748c commit 9fb4e54

File tree

3 files changed

+65
-12
lines changed

3 files changed

+65
-12
lines changed

lang/tests.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1+
import unittest
2+
from unittest import mock
3+
4+
from django.test import override_settings
15
from django.conf import settings
26
from django.core import management
37
from django.contrib.auth.models import User, Permission
48
from main.test_case import APITestCase
59

10+
from lang.translation import IfrcTranslator
11+
612
from .serializers import LanguageBulkActionSerializer
713
from .models import String
814

@@ -153,3 +159,44 @@ def test_lang_api_permissions(self):
153159
self.authenticate(user)
154160
resp = self.client.post(f'/api/v2/language/{language}/bulk-action/', data, format='json')
155161
self.assertEqual(resp.status_code, 200)
162+
163+
164+
class TranslatorMockTest(unittest.TestCase):
165+
166+
@mock.patch('lang.translation.requests')
167+
def test_ifrc_translator(self, requests_mock):
168+
# Simple mock test where we define what the expected response is from provider
169+
requests_mock.post.return_value.json.return_value = [{
170+
"detectedLanguage": {"language": "en", "score": 1},
171+
"translations": [{"text": "Hola", "to": "es"}]
172+
}]
173+
174+
# Without valid settings provided
175+
for settings_params in [
176+
dict(),
177+
dict(
178+
IFRC_TRANSLATION_GET_API_KEY='dummy-api-param-key',
179+
IFRC_TRANSLATION_HEADER_API_KEY='dummy-api-header-key',
180+
),
181+
dict(IFRC_TRANSLATION_HEADER_API_KEY='dummy-api-header-key'),
182+
]:
183+
with override_settings(
184+
AUTO_TRANSLATION_TRANSLATOR='lang.translation.IfrcTranslator',
185+
**settings_params,
186+
):
187+
with self.assertRaises(Exception):
188+
IfrcTranslator()
189+
190+
# With valid settings provided
191+
with override_settings(
192+
AUTO_TRANSLATION_TRANSLATOR='lang.translation.IfrcTranslator',
193+
IFRC_TRANSLATION_DOMAIN='http://example.org',
194+
IFRC_TRANSLATION_GET_API_KEY='dummy-api-param-key',
195+
IFRC_TRANSLATION_HEADER_API_KEY='dummy-api-header-key',
196+
):
197+
# with settings.TESTING True
198+
ifrc_translator = IfrcTranslator()
199+
assert ifrc_translator.translate_text('hello', 'es') == 'hello translated to "es" using source language "None"'
200+
# with settings.TESTING False
201+
with override_settings(TESTING=False):
202+
assert ifrc_translator.translate_text('hello', 'es') == "Hola"

lang/translation.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,21 +65,24 @@ class IfrcTranslator(BaseTranslator):
6565
"""
6666
IFRC Translator helper
6767
"""
68+
domain: str
6869
url: str
6970
params: dict
7071

7172
def __init__(self):
72-
if settings.TESTING:
73-
return
74-
7573
if (
76-
not settings.IFRC_TRANSLATION_URL or
77-
not settings.IFRC_TRANSLATION_API_KEY
74+
not settings.IFRC_TRANSLATION_DOMAIN or
75+
not settings.IFRC_TRANSLATION_GET_API_KEY or
76+
not settings.IFRC_TRANSLATION_HEADER_API_KEY
7877
):
7978
raise Exception('Translation configuration missing')
80-
self.url = settings.IFRC_TRANSLATION_URL
79+
self.domain = settings.IFRC_TRANSLATION_DOMAIN.strip('/')
80+
self.url = f'{self.domain}/TranslationV2_API/api/Home/Translate'
81+
self.headers = {
82+
'X-API-KEY': settings.IFRC_TRANSLATION_HEADER_API_KEY,
83+
}
8184
self.params = dict(
82-
apiKey=settings.IFRC_TRANSLATION_API_KEY
85+
apiKey=settings.IFRC_TRANSLATION_GET_API_KEY
8386
)
8487

8588
def translate_text(self, text, dest_language, source_language=None):
@@ -93,10 +96,11 @@ def translate_text(self, text, dest_language, source_language=None):
9396
}
9497
response = requests.post(
9598
self.url,
99+
headers=self.headers,
96100
params=self.params,
97101
json=payload,
98102
)
99-
return response.json()[0]["Translations"][0]["Text"]
103+
return response.json()[0]["translations"][0]["text"]
100104

101105

102106
def get_translator_class():

main/settings.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,9 @@
5555
AWS_TRANSLATE_SECRET_KEY=(str, None),
5656
AWS_TRANSLATE_REGION=(str, None),
5757
# IFRC Translation
58-
IFRC_TRANSLATION_URL=(str, None),
59-
IFRC_TRANSLATION_API_KEY=(str, None),
58+
IFRC_TRANSLATION_DOMAIN=(str, None), # https://example.ifrc.org
59+
IFRC_TRANSLATION_GET_API_KEY=(str, None),
60+
IFRC_TRANSLATION_HEADER_API_KEY=(str, None),
6061
# Celery NOTE: Not used right now
6162
CELERY_REDIS_URL=str,
6263
CACHE_REDIS_URL=str,
@@ -353,8 +354,9 @@
353354
MODELTRANSLATION_FALLBACK_LANGUAGES = ('en', 'fr', 'es', 'ar')
354355
AUTO_TRANSLATION_TRANSLATOR = env('AUTO_TRANSLATION_TRANSLATOR')
355356

356-
IFRC_TRANSLATION_URL = env('IFRC_TRANSLATION_URL')
357-
IFRC_TRANSLATION_API_KEY = env('IFRC_TRANSLATION_API_KEY')
357+
IFRC_TRANSLATION_DOMAIN = env('IFRC_TRANSLATION_DOMAIN')
358+
IFRC_TRANSLATION_GET_API_KEY = env('IFRC_TRANSLATION_GET_API_KEY')
359+
IFRC_TRANSLATION_HEADER_API_KEY = env('IFRC_TRANSLATION_HEADER_API_KEY')
358360

359361
MEDIA_URL = env('DJANGO_MEDIA_URL')
360362
MEDIA_ROOT = env('DJANGO_MEDIA_ROOT')

0 commit comments

Comments
 (0)