[IMP] Gengo Fixes
authorFabien Pinckaers <fp@tinyerp.com>
Wed, 9 Apr 2014 21:45:09 +0000 (23:45 +0200)
committerFabien Pinckaers <fp@tinyerp.com>
Wed, 9 Apr 2014 21:45:09 +0000 (23:45 +0200)
bzr revid: fp@tinyerp.com-20140409214509-0ww46dnt3np66ncx

addons/base_gengo/__init__.py
addons/base_gengo/controller/__init__.py [new file with mode: 0644]
addons/base_gengo/controller/gengo_callback.py [new file with mode: 0644]
addons/base_gengo/wizard/base_gengo_translations.py
addons/website_gengo/controllers/main.py
addons/website_gengo/static/src/js/website_gengo.js

index 133fa90..ff48d6c 100644 (file)
@@ -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 (file)
index 0000000..4648ae6
--- /dev/null
@@ -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 (file)
index 0000000..fe401c5
--- /dev/null
@@ -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)
index 8cc7206..e93f82d 100644 (file)
@@ -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]
index b1776f9..9efa1a2 100644 (file)
@@ -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/<model("ir.translation"):term>', 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)
index 75c82f8..a1755ed 100644 (file)
@@ -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', {