Skip to content

Commit

Permalink
Merge pull request #1840 from IFRCGo/feat/ifrc-translation-api-v2
Browse files Browse the repository at this point in the history
Update logic for new translation API
  • Loading branch information
szabozoltan69 authored Jul 5, 2023
2 parents 87c319d + b90748c commit 9fb4e54
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 12 deletions.
47 changes: 47 additions & 0 deletions lang/tests.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
import unittest
from unittest import mock

from django.test import override_settings
from django.conf import settings
from django.core import management
from django.contrib.auth.models import User, Permission
from main.test_case import APITestCase

from lang.translation import IfrcTranslator

from .serializers import LanguageBulkActionSerializer
from .models import String

Expand Down Expand Up @@ -153,3 +159,44 @@ def test_lang_api_permissions(self):
self.authenticate(user)
resp = self.client.post(f'/api/v2/language/{language}/bulk-action/', data, format='json')
self.assertEqual(resp.status_code, 200)


class TranslatorMockTest(unittest.TestCase):

@mock.patch('lang.translation.requests')
def test_ifrc_translator(self, requests_mock):
# Simple mock test where we define what the expected response is from provider
requests_mock.post.return_value.json.return_value = [{
"detectedLanguage": {"language": "en", "score": 1},
"translations": [{"text": "Hola", "to": "es"}]
}]

# Without valid settings provided
for settings_params in [
dict(),
dict(
IFRC_TRANSLATION_GET_API_KEY='dummy-api-param-key',
IFRC_TRANSLATION_HEADER_API_KEY='dummy-api-header-key',
),
dict(IFRC_TRANSLATION_HEADER_API_KEY='dummy-api-header-key'),
]:
with override_settings(
AUTO_TRANSLATION_TRANSLATOR='lang.translation.IfrcTranslator',
**settings_params,
):
with self.assertRaises(Exception):
IfrcTranslator()

# With valid settings provided
with override_settings(
AUTO_TRANSLATION_TRANSLATOR='lang.translation.IfrcTranslator',
IFRC_TRANSLATION_DOMAIN='http://example.org',
IFRC_TRANSLATION_GET_API_KEY='dummy-api-param-key',
IFRC_TRANSLATION_HEADER_API_KEY='dummy-api-header-key',
):
# with settings.TESTING True
ifrc_translator = IfrcTranslator()
assert ifrc_translator.translate_text('hello', 'es') == 'hello translated to "es" using source language "None"'
# with settings.TESTING False
with override_settings(TESTING=False):
assert ifrc_translator.translate_text('hello', 'es') == "Hola"
20 changes: 12 additions & 8 deletions lang/translation.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,21 +65,24 @@ class IfrcTranslator(BaseTranslator):
"""
IFRC Translator helper
"""
domain: str
url: str
params: dict

def __init__(self):
if settings.TESTING:
return

if (
not settings.IFRC_TRANSLATION_URL or
not settings.IFRC_TRANSLATION_API_KEY
not settings.IFRC_TRANSLATION_DOMAIN or
not settings.IFRC_TRANSLATION_GET_API_KEY or
not settings.IFRC_TRANSLATION_HEADER_API_KEY
):
raise Exception('Translation configuration missing')
self.url = settings.IFRC_TRANSLATION_URL
self.domain = settings.IFRC_TRANSLATION_DOMAIN.strip('/')
self.url = f'{self.domain}/TranslationV2_API/api/Home/Translate'
self.headers = {
'X-API-KEY': settings.IFRC_TRANSLATION_HEADER_API_KEY,
}
self.params = dict(
apiKey=settings.IFRC_TRANSLATION_API_KEY
apiKey=settings.IFRC_TRANSLATION_GET_API_KEY
)

def translate_text(self, text, dest_language, source_language=None):
Expand All @@ -93,10 +96,11 @@ def translate_text(self, text, dest_language, source_language=None):
}
response = requests.post(
self.url,
headers=self.headers,
params=self.params,
json=payload,
)
return response.json()[0]["Translations"][0]["Text"]
return response.json()[0]["translations"][0]["text"]


def get_translator_class():
Expand Down
10 changes: 6 additions & 4 deletions main/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,9 @@
AWS_TRANSLATE_SECRET_KEY=(str, None),
AWS_TRANSLATE_REGION=(str, None),
# IFRC Translation
IFRC_TRANSLATION_URL=(str, None),
IFRC_TRANSLATION_API_KEY=(str, None),
IFRC_TRANSLATION_DOMAIN=(str, None), # https://example.ifrc.org
IFRC_TRANSLATION_GET_API_KEY=(str, None),
IFRC_TRANSLATION_HEADER_API_KEY=(str, None),
# Celery NOTE: Not used right now
CELERY_REDIS_URL=str,
CACHE_REDIS_URL=str,
Expand Down Expand Up @@ -353,8 +354,9 @@
MODELTRANSLATION_FALLBACK_LANGUAGES = ('en', 'fr', 'es', 'ar')
AUTO_TRANSLATION_TRANSLATOR = env('AUTO_TRANSLATION_TRANSLATOR')

IFRC_TRANSLATION_URL = env('IFRC_TRANSLATION_URL')
IFRC_TRANSLATION_API_KEY = env('IFRC_TRANSLATION_API_KEY')
IFRC_TRANSLATION_DOMAIN = env('IFRC_TRANSLATION_DOMAIN')
IFRC_TRANSLATION_GET_API_KEY = env('IFRC_TRANSLATION_GET_API_KEY')
IFRC_TRANSLATION_HEADER_API_KEY = env('IFRC_TRANSLATION_HEADER_API_KEY')

MEDIA_URL = env('DJANGO_MEDIA_URL')
MEDIA_ROOT = env('DJANGO_MEDIA_ROOT')
Expand Down

0 comments on commit 9fb4e54

Please sign in to comment.