Skip to content

Commit

Permalink
Merge branch 'feature-1821-multilingual-extension' of github.com:okfn…
Browse files Browse the repository at this point in the history
…/ckan into feature-1821-multilingual-extension

Conflicts:
	ckanext/multilingual/tests/test_multilingual_plugin.py
  • Loading branch information
Sean Hammond committed Mar 13, 2012
2 parents 73a2b88 + 513d95d commit 0c0c813
Show file tree
Hide file tree
Showing 2 changed files with 131 additions and 2 deletions.
52 changes: 50 additions & 2 deletions ckanext/multilingual/plugin.py
Expand Up @@ -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']
Expand Down Expand Up @@ -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)
Expand Down
81 changes: 81 additions & 0 deletions 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
Expand Down Expand Up @@ -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

0 comments on commit 0c0c813

Please sign in to comment.