diff --git a/ckanext/multilingual/plugin.py b/ckanext/multilingual/plugin.py index c7b68ca748a..c8fac6d377a 100644 --- a/ckanext/multilingual/plugin.py +++ b/ckanext/multilingual/plugin.py @@ -3,6 +3,7 @@ from ckan.plugins import SingletonPlugin, implements, IPackageController from ckan.plugins import IGroupController, ITagController import pylons +import ckan.logic.action.get as action_get from pylons import config LANGS = ['en', 'fr', 'de', 'es', 'it', 'nl', 'ro', 'pt', 'pl'] @@ -88,11 +89,58 @@ def translate_data_dict(data_dict): .unflatten(translated_flattened)) return translated_data_dict +KEYS_TO_IGNORE = ['state', 'revision_id', 'id', #title done seperately + 'metadata_created', 'metadata_modified', 'site_id'] + class MultilingualDataset(SingletonPlugin): implements(IPackageController, inherit=True) - def before_index(self, search_params): - return search_params + def before_index(self, search_data): + + default_lang = search_data.get( + 'lang_code', + pylons.config.get('ckan.locale_default', 'en') + ) + + ## transloate title + title = search_data.get('title') + search_data['title_' + default_lang] = title + title_translations = action_get.term_translation_show( + {'model': ckan.model}, + {'terms': [title], + 'lang_codes': LANGS}) + + for translation in title_translations: + title_field = 'title_' + translation['lang_code'] + search_data[title_field] = translation['term_translation'] + + ## transloate rest + all_terms = [] + for key, value in search_data.iteritems(): + if key in KEYS_TO_IGNORE or key.startswith('title'): + continue + if isinstance(value, list): + all_terms.extend(value) + else: + all_terms.append(value) + + field_translations = action_get.term_translation_show( + {'model': ckan.model}, + {'terms': all_terms, + 'lang_codes': LANGS}) + + text_field_items = dict(('text_' + lang, []) for lang in LANGS) + + text_field_items['text_' + default_lang].extend(all_terms) + + for translation in sorted(field_translations): + lang_field = 'text_' + translation['lang_code'] + text_field_items[lang_field].append(translation['term_translation']) + + for key, value in text_field_items.iteritems(): + search_data[key] = ' '.join(value) + + return search_data def before_search(self, search_params): lang_set = set(LANGS) diff --git a/ckanext/multilingual/tests/test_multilingual_plugin.py b/ckanext/multilingual/tests/test_multilingual_plugin.py index 29115fb7ccf..2398e297745 100644 --- a/ckanext/multilingual/tests/test_multilingual_plugin.py +++ b/ckanext/multilingual/tests/test_multilingual_plugin.py @@ -1,4 +1,5 @@ import ckan.plugins +import ckanext.multilingual.plugin as mulilingual_plugin import ckan.lib.helpers import ckan.lib.create_test_data import ckan.logic.action.update @@ -199,3 +200,83 @@ def test_tag_list_translation(self): response.mustcontain(term) nose.tools.assert_raises(IndexError, response.mustcontain, 'this should not be rendered') + +class TestDatasetSearchIndex(): + + @classmethod + def setup_class(cls): + ckan.plugins.load('multilingual_dataset') + ckan.plugins.load('multilingual_group') + + data_dicts = [ + {'term': 'moo', + 'term_translation': 'french_moo', + 'lang_code': 'fr', + }, # + {'term': 'moo', + 'term_translation': 'this should not be rendered', + 'lang_code': 'fsdas', + }, + {'term': 'an interesting note', + 'term_translation': 'french note', + 'lang_code': 'fr', + }, + {'term': 'moon', + 'term_translation': 'french moon', + 'lang_code': 'fr', + }, + {'term': 'boon', + 'term_translation': 'french boon', + 'lang_code': 'fr', + }, + {'term': 'boon', + 'term_translation': 'italian boon', + 'lang_code': 'it', + }, + {'term': 'david', + 'term_translation': 'french david', + 'lang_code': 'fr', + }, + {'term': 'david', + 'term_translation': 'italian david', + 'lang_code': 'it', + }, + ] + + context = { + 'model': ckan.model, + 'session': ckan.model.Session, + 'user': 'testsysadmin', + 'ignore_auth': True, + } + for data_dict in data_dicts: + ckan.logic.action.update.term_translation_update(context, + data_dict) + + def test_translate_terms(self): + + sample_index_data = { + 'download_url': u'moo', + 'notes': u'an interesting note', + 'tags': [u'moon', 'boon'], + 'title': u'david', + } + + result = mulilingual_plugin.MultilingualDataset().before_index(sample_index_data) + + assert result == {'text_pl': '', + 'text_de': '', + 'text_ro': '', + 'title': u'david', + 'notes': u'an interesting note', + 'tags': [u'moon', 'boon'], + 'title_en': u'david', + 'download_url': u'moo', + 'text_it': u'italian boon', + 'text_es': '', + 'text_en': u'an interesting note moon boon moo', + 'text_nl': '', + 'title_it': u'italian david', + 'text_pt': '', + 'title_fr': u'french david', + 'text_fr': u'french note french boon french_moo french moon'}, result