diff --git a/addons/base_gengo/__init__.py b/addons/base_gengo/__init__.py index 133fa90dc51..ff48d6cc91f 100644 --- a/addons/base_gengo/__init__.py +++ b/addons/base_gengo/__init__.py @@ -22,5 +22,6 @@ import res_company import ir_translation import wizard +import controller # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_gengo/controller/__init__.py b/addons/base_gengo/controller/__init__.py new file mode 100644 index 00000000000..4648ae64b0f --- /dev/null +++ b/addons/base_gengo/controller/__init__.py @@ -0,0 +1 @@ +import gengo_callback diff --git a/addons/base_gengo/controller/gengo_callback.py b/addons/base_gengo/controller/gengo_callback.py new file mode 100644 index 00000000000..fe401c508e9 --- /dev/null +++ b/addons/base_gengo/controller/gengo_callback.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- + +import openerp +from openerp.addons.web import http +from openerp.addons.web.http import request + +class website_gengo(http.Controller): + @http.route('/website/gengo_callback', type='http', auth='none') + def gengo_callback(self,**post): + cr, uid, context = request.cr, openerp.SUPERUSER_ID, request.context + translation_pool = request.registry['ir.translation'] + if post and post.get('job'): + job = json.loads(post['job']) + tid = job.get('custom_data', False) + if (job.get('status') == 'approved') and tid: + term = translation_pool.browse(cr, uid, int(tid), context=context) + if term.job_id <> job.get('job_id'): + raise 'Error' + vals = {'state': 'translated', 'value': job.get('body_tgt')} + translation_pool.write(cr, uid, [int(tid)], vals, context=context) diff --git a/addons/base_gengo/wizard/base_gengo_translations.py b/addons/base_gengo/wizard/base_gengo_translations.py index 8cc7206e63e..e93f82d1ec7 100644 --- a/addons/base_gengo/wizard/base_gengo_translations.py +++ b/addons/base_gengo/wizard/base_gengo_translations.py @@ -33,10 +33,6 @@ try: from mygengo import MyGengo except ImportError: _logger.warning('Gengo library not found, Gengo features disabled. If you plan to use it, please install the mygengo library from http://pypi.python.org/pypi/mygengo') - class MyGengo(object): - def __init__(self, *args, **kwargs): - # no context for translations - so don't bother - raise ImportError('Gengo library not found, please install mygengo from http://pypi.python.org/pypi/mygengo') GENGO_DEFAULT_LIMIT = 20 @@ -120,51 +116,45 @@ class base_gengo_translations(osv.osv_memory): all_translation_ids = translation_pool.search(cr, uid, [('state', '=', 'inprogress'), ('gengo_translation', 'in', ('machine', 'standard', 'pro', 'ultra')), ('job_id', "!=", False)], context=context) while True: translation_ids = all_translation_ids[offset:offset + limit] - if translation_ids: - offset += limit - translation_terms = translation_pool.browse(cr, uid, translation_ids, context=context) - gengo_job_id = [term.job_id for term in translation_terms] - if gengo_job_id: - gengo_ids = ','.join(gengo_job_id) - job_response = gengo.getTranslationJobBatch(id=gengo_ids) - if job_response['opstat'] == 'ok': - job_response_dict = dict([(job['job_id'], job) for job in job_response['response']['jobs']]) - for term in translation_terms: - up_term = up_comment = 0 - vals = {} - if job_response_dict[term.job_id]['status'] == 'approved': - vals.update({'state': 'translated', - 'value': job_response_dict[term.job_id]['body_tgt']}) - up_term += 1 - job_comment = gengo.getTranslationJobComments(id=term.job_id) - if job_comment['opstat'] == 'ok': - gengo_comments = "" - for comment in job_comment['response']['thread']: - gengo_comments += _('%s\n-- Commented on %s by %s.\n\n') % (comment['body'], time.ctime(comment['ctime']), comment['author']) - vals.update({'gengo_comment': gengo_comments}) - up_comment += 1 - if vals: - translation_pool.write(cr, uid, term.id, vals) - _logger.info("Successfully Updated `%d` terms and %d Comments." % (up_term, up_comment)) - if not len(translation_ids) == limit: + offset += limit + if not translation_ids: break + translation_terms = translation_pool.browse(cr, uid, translation_ids, context=context) + gengo_job_id = [term.job_id for term in translation_terms] + if gengo_job_id: + gengo_ids = ','.join(gengo_job_id) + try: + job_response = gengo.getTranslationJobBatch(id=gengo_ids) + except: + continue + if job_response['opstat'] == 'ok': + for job in job_response['response'].get('jobs', []): + self._update_terms_job(cr, uid, job, context=context) return True + def _update_terms_job(self, cr, uid, job, context=None): + translation_pool = self.pool.get('ir.translation') + tid = int(job['custom_data']) + vals = {} + if job.get('job_id', False): + vals['job_id'] = job['job_id'] + vals['state'] = 'inprogress' + if job.get('status', False) in ('queued','available','pending','reviewable'): + vals['state'] = 'inprogress' + if job.get('body_tgt', False) and job.get('status', False)=='approved': + vals['value'] = job['body_tgt'] + if job.get('status', False) in ('approved', 'canceled'): + vals['state'] = 'translated' + if vals: + translation_pool.write(cr, uid, [tid], vals, context=context) + def _update_terms(self, cr, uid, response, context=None): """ Update the terms after their translation were requested to Gengo """ - translation_pool = self.pool.get('ir.translation') - for jobs in response['jobs']: + for jobs in response.get('jobs', []): for t_id, res in jobs.items(): - vals = {} - t_id = int(t_id) - tier = translation_pool.read(cr, uid, [t_id], ['gengo_translation'], context=context)[0]['gengo_translation'] - if tier == "machine": - vals.update({'value': res['body_tgt'], 'state': 'translated'}) - else: - vals.update({'job_id': res['job_id'], 'state': 'inprogress'}) - translation_pool.write(cr, uid, [t_id], vals, context=context) + self._update_terms_job(cr, uid, res, context=context) return def pack_jobs_request(self, cr, uid, term_ids, context=None): @@ -181,15 +171,20 @@ class base_gengo_translations(osv.osv_memory): auto_approve = 1 if user.company_id.gengo_auto_approve else 0 for term in translation_pool.browse(cr, uid, term_ids, context=context): if re.search(r"\w", term.src or ""): - jobs[term.id] = {'type': 'text', - 'slug': 'single::English to ' + term.lang, - 'tier': tools.ustr(term.gengo_translation), - 'body_src': term.src, - 'lc_src': 'en', - 'lc_tgt': translation_pool._get_gengo_corresponding_language(term.lang), - 'auto_approve': auto_approve, - 'comment': user.company_id.gengo_comment and "%s %s"%(user.company_id.gengo_comment,term.gengo_comment) or term.gengo_comment, - 'callback_url': self.pool.get('ir.config_parameter').get_param(cr, uid,'web.base.url') + '/website/gengo_callback/' + str(term.id) + comment = user.company_id.gengo_comment or '' + if term.gengo_comment: + comment+='\n' + term.gengo_comment + jobs[time.strftime('%Y%m%d%H%M%S') + '-' + str(term.id)] = { + 'type': 'text', + 'slug': 'Single :: English to ' + term.lang, + 'tier': tools.ustr(term.gengo_translation), + 'custom_data': str(term.id), + 'body_src': term.src, + 'lc_src': 'en', + 'lc_tgt': translation_pool._get_gengo_corresponding_language(term.lang), + 'auto_approve': auto_approve, + 'comment': comment, + 'callback_url': self.pool.get('ir.config_parameter').get_param(cr, uid,'web.base.url') + '/website/gengo_callback' } return {'jobs': jobs} @@ -223,15 +218,14 @@ class base_gengo_translations(osv.osv_memory): context = {} language_pool = self.pool.get('res.lang') translation_pool = self.pool.get('ir.translation') + domain = [('state', '=', 'to_translate'), ('gengo_translation', 'in', ('machine', 'standard', 'pro', 'ultra')), ('job_id', "=", False)] + if context.get('gengo_language', False): + lc = language_pool.browse(cr, uid, context['gengo_language'], context=context).code + domain.append( ('lang', '=', lc) ) + + all_term_ids = translation_pool.search(cr, uid, domain, context=context) try: - #by default, the request will be made for all terms that needs it, whatever the language - lang_ids = language_pool.search(cr, uid, [], context=context) - if context.get('gengo_language'): - #but if this specific key is given, then we restrict the request on terms of this language only - lang_ids = [context.get('gengo_language')] - langs = [lang.code for lang in language_pool.browse(cr, uid, lang_ids, context=context)] offset = 0 - all_term_ids = translation_pool.search(cr, uid, [('state', '=', 'to_translate'), ('gengo_translation', 'in', ('machine', 'standard', 'pro', 'ultra')), ('lang', 'in', langs), ('job_id', "=", False)], context=context) while True: #search for the n first terms to translate term_ids = all_term_ids[offset:offset + limit] diff --git a/addons/website_gengo/controllers/main.py b/addons/website_gengo/controllers/main.py index b1776f9974a..9efa1a208fe 100644 --- a/addons/website_gengo/controllers/main.py +++ b/addons/website_gengo/controllers/main.py @@ -40,21 +40,3 @@ class website_gengo(http.Controller): def post_gengo_jobs(self): request.registry['base.gengo.translations']._sync_request(request.cr, request.uid, limit=GENGO_DEFAULT_LIMIT, context=request.context) return True - - @http.route('/website/gengo_callback/', type='http', auth='none') - def gengo_callback(self,term,**post): - if post and post.get('job'): - translation_pool = request.registry['ir.translation'] - base_gengo_pool = request.registry['base.gengo.translations'] - job, vals = json.loads(post['job']), {} - if job.get('status') == 'approved': - vals.update({'state': 'translated', 'value': job.get('body_tgt')}) - flag, gengo = base_gengo_pool.gengo_authentication(request.cr, openerp.SUPERUSER_ID, context=request.context) - job_comment = gengo.getTranslationJobComments(id=job.get('job_id')) - if job_comment['opstat']=='ok': - gengo_comments="" - for comment in job_comment['response']['thread']: - gengo_comments += _('%s\n-- Commented on %s by %s.\n\n') % (comment['body'], time.ctime(comment['ctime']), comment['author']) - vals.update({'gengo_comment': gengo_comments}) - if vals: - translation_pool.write(request.cr, openerp.SUPERUSER_ID, term.id, vals) diff --git a/addons/website_gengo/static/src/js/website_gengo.js b/addons/website_gengo/static/src/js/website_gengo.js index 75c82f83a46..a1755ed1290 100644 --- a/addons/website_gengo/static/src/js/website_gengo.js +++ b/addons/website_gengo/static/src/js/website_gengo.js @@ -56,7 +56,7 @@ new_content:self.getInitialContent(this), translation_id: data.oeTranslationId || null, gengo_translation: gengo_service_level, - gengo_comment:"Original page:" + document.URL + gengo_comment:"\nOriginal Page: " + document.URL }); }); openerp.jsonRpc('/website/set_translations', 'call', {