From 9eda964e6e165f35a77242cba0e57c3e73187b6a Mon Sep 17 00:00:00 2001 From: "Twinkle Christian (OpenERP)" Date: Fri, 13 Jul 2012 17:41:29 +0530 Subject: [PATCH 01/10] [IMP]Adding .py files in base_gengo module bzr revid: tch@tinyerp.com-20120713121129-bw973p0ruwlvfm60 --- addons/base_gengo/__init__.py | 9 +++++++++ addons/base_gengo/__openerp__.py | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/addons/base_gengo/__init__.py b/addons/base_gengo/__init__.py index 6825dc22f47..e1537d7ab27 100644 --- a/addons/base_gengo/__init__.py +++ b/addons/base_gengo/__init__.py @@ -19,4 +19,13 @@ # ############################################################################## +import res_company +import ir_translation + + + + + + + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_gengo/__openerp__.py b/addons/base_gengo/__openerp__.py index 43a6e258418..4f1d296f856 100644 --- a/addons/base_gengo/__openerp__.py +++ b/addons/base_gengo/__openerp__.py @@ -30,7 +30,9 @@ Automated Translations through Gengo API 'website': 'http://www.openerp.com', 'depends': ['base'], 'init_xml': [], - 'update_xml': [], + 'update_xml': [ + 'ir_translation.xml' + ], 'demo_xml': [], 'test': [], 'installable': True, From 07f5aaf242b6a2f69d6242ce7cf8f9d77430ba2c Mon Sep 17 00:00:00 2001 From: "Twinkle Christian (OpenERP)" Date: Fri, 13 Jul 2012 17:49:35 +0530 Subject: [PATCH 02/10] [IMP]Adding .py files in base_gengo module bzr revid: tch@tinyerp.com-20120713121935-8akpxoebe6i9j1ja --- addons/base_gengo/ir_translation.py | 41 ++++++++++++++++++++++++++ addons/base_gengo/ir_translation.xml | 17 +++++++++++ addons/base_gengo/res_company.py | 43 ++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 addons/base_gengo/ir_translation.py create mode 100644 addons/base_gengo/ir_translation.xml create mode 100644 addons/base_gengo/res_company.py diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py new file mode 100644 index 00000000000..7160d102970 --- /dev/null +++ b/addons/base_gengo/ir_translation.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import fields,osv,orm +import os +import openerp +import tools + +class ir_translation(osv.osv): + _name = "ir.translation" + _description="Translation" + _inherit="ir.translation" + _columns = { + 'gengo_comment':fields.text("comments", help="Comment for translators"), + 'gengo_translation':fields.boolean("Translation", help='This term has to be translated by Gengo automatically'), + 'gengo_control':fields.boolean('Active'), + + } + + _defaults = { + 'gengo_control':False, + } + diff --git a/addons/base_gengo/ir_translation.xml b/addons/base_gengo/ir_translation.xml new file mode 100644 index 00000000000..72c6f99730d --- /dev/null +++ b/addons/base_gengo/ir_translation.xml @@ -0,0 +1,17 @@ + + + + + Translations + ir.translation + + search + + + + + + + + + diff --git a/addons/base_gengo/res_company.py b/addons/base_gengo/res_company.py new file mode 100644 index 00000000000..1fa07bb65e2 --- /dev/null +++ b/addons/base_gengo/res_company.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import fields,osv,orm +import os +import openerp +import tools + +class res_company(osv.osv): + _name = "res.company" + _description = "companies" + _inherit = "res.company" + _columns = { + "gengo_private_key":fields.text("Gengo private key"), + "gengo_public_key":fields.text("Gengo public key"), + "gengo_tier":fields.selection([('machine','Machine'), + ('standard','Standard'), + ('pro','Pro'), + ('ultra','Ultra')],"Tier types", required=True), + "gengo_comment":fields.text("comments"), + "gengo_auto_approve":fields.boolean("Active"), + "fields_ids":fields.many2many('ir.model.fields','fields_company_rel','field_id','model_id'), + + } + From 99f81a5d9723f931b2963dd1b26e673cd023457f Mon Sep 17 00:00:00 2001 From: "Twinkle Christian (OpenERP)" Date: Fri, 13 Jul 2012 18:38:03 +0530 Subject: [PATCH 03/10] [IMP]Adding .py files in base_gengo module bzr revid: tch@tinyerp.com-20120713130803-slnbqdvlc9ypf14a --- addons/base_gengo/ir_translation.py | 7 ++----- addons/base_gengo/res_company.py | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index 7160d102970..053f72f5c2c 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -19,12 +19,9 @@ # ############################################################################## -from osv import fields,osv,orm -import os -import openerp -import tools +from osv import fields,osv -class ir_translation(osv.osv): +class ir_translation(osv.Model): _name = "ir.translation" _description="Translation" _inherit="ir.translation" diff --git a/addons/base_gengo/res_company.py b/addons/base_gengo/res_company.py index 1fa07bb65e2..81ef413dbe0 100644 --- a/addons/base_gengo/res_company.py +++ b/addons/base_gengo/res_company.py @@ -19,12 +19,9 @@ # ############################################################################## -from osv import fields,osv,orm -import os -import openerp -import tools +from osv import fields,osv -class res_company(osv.osv): +class res_company(osv.Model): _name = "res.company" _description = "companies" _inherit = "res.company" From be6cb0c3cab8d52e86171d441ed5cc2cd41d625b Mon Sep 17 00:00:00 2001 From: "ajay javiya (OpenERP)" Date: Mon, 16 Jul 2012 18:11:35 +0530 Subject: [PATCH 04/10] [IMP]: Improve in base_gengo module bzr revid: aja@tinyerp.com-20120716124135-k2gyo052r460c3fv --- addons/base_gengo/__openerp__.py | 4 +-- addons/base_gengo/ir_translation.py | 3 +-- addons/base_gengo/ir_translation.xml | 21 ++++++++++++++- addons/base_gengo/res_company.py | 12 +++++---- addons/base_gengo/res_company_view.xml | 37 ++++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 addons/base_gengo/res_company_view.xml diff --git a/addons/base_gengo/__openerp__.py b/addons/base_gengo/__openerp__.py index 4f1d296f856..7afc573b0ca 100644 --- a/addons/base_gengo/__openerp__.py +++ b/addons/base_gengo/__openerp__.py @@ -18,7 +18,6 @@ # along with this program. If not, see . # ############################################################################## - { 'name': 'Automated Translations through Gengo API', 'version': '0.1', @@ -31,7 +30,8 @@ Automated Translations through Gengo API 'depends': ['base'], 'init_xml': [], 'update_xml': [ - 'ir_translation.xml' + 'ir_translation.xml', + 'res_company_view.xml' ], 'demo_xml': [], 'test': [], diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index 053f72f5c2c..46d48af87de 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -26,10 +26,9 @@ class ir_translation(osv.Model): _description="Translation" _inherit="ir.translation" _columns = { - 'gengo_comment':fields.text("comments", help="Comment for translators"), + 'gengo_comment':fields.text("Comments"), 'gengo_translation':fields.boolean("Translation", help='This term has to be translated by Gengo automatically'), 'gengo_control':fields.boolean('Active'), - } _defaults = { diff --git a/addons/base_gengo/ir_translation.xml b/addons/base_gengo/ir_translation.xml index 72c6f99730d..52b081cd7d6 100644 --- a/addons/base_gengo/ir_translation.xml +++ b/addons/base_gengo/ir_translation.xml @@ -9,9 +9,28 @@ - + + + + + ir.translation.form.inherit + + ir.translation + form + + + + + + + + + + + + diff --git a/addons/base_gengo/res_company.py b/addons/base_gengo/res_company.py index 81ef413dbe0..ddfb68f7141 100644 --- a/addons/base_gengo/res_company.py +++ b/addons/base_gengo/res_company.py @@ -23,7 +23,7 @@ from osv import fields,osv class res_company(osv.Model): _name = "res.company" - _description = "companies" + _description = "Companies" _inherit = "res.company" _columns = { "gengo_private_key":fields.text("Gengo private key"), @@ -33,8 +33,10 @@ class res_company(osv.Model): ('pro','Pro'), ('ultra','Ultra')],"Tier types", required=True), "gengo_comment":fields.text("comments"), - "gengo_auto_approve":fields.boolean("Active"), - "fields_ids":fields.many2many('ir.model.fields','fields_company_rel','field_id','model_id'), - + "gengo_auto_approve":fields.boolean("Active",help="Jobs are Automatically Approved by Gengo."), + "fields_ids":fields.many2many('ir.model.fields','fields_company_rel','field_id','model_id','fields'), + } + + _defaults={ + "gengo_tier":"machine", } - diff --git a/addons/base_gengo/res_company_view.xml b/addons/base_gengo/res_company_view.xml new file mode 100644 index 00000000000..a4f6ceffcce --- /dev/null +++ b/addons/base_gengo/res_company_view.xml @@ -0,0 +1,37 @@ + + + + + + res.company.form.inherit + + res.company + form + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 70e73559d2f91e54215f6a2de779dce8a0f0580d Mon Sep 17 00:00:00 2001 From: "ajay javiya (OpenERP)" Date: Mon, 16 Jul 2012 18:36:51 +0530 Subject: [PATCH 05/10] [IMP]: change license in base_gengo module bzr revid: aja@tinyerp.com-20120716130651-qk7z3c1uaypjr9z4 --- addons/base_gengo/__init__.py | 6 ------ addons/base_gengo/ir_translation.py | 4 ++-- addons/base_gengo/res_company.py | 4 ++-- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/addons/base_gengo/__init__.py b/addons/base_gengo/__init__.py index e1537d7ab27..ca798adebee 100644 --- a/addons/base_gengo/__init__.py +++ b/addons/base_gengo/__init__.py @@ -22,10 +22,4 @@ import res_company import ir_translation - - - - - - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index 46d48af87de..a658b935c93 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). +# OpenERP, Open Source Business Applications +# Copyright (C) 2004-2012 OpenERP S.A. (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/addons/base_gengo/res_company.py b/addons/base_gengo/res_company.py index ddfb68f7141..2a91d13f1b1 100644 --- a/addons/base_gengo/res_company.py +++ b/addons/base_gengo/res_company.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). +# OpenERP, Open Source Business Applications +# Copyright (C) 2004-2012 OpenERP S.A. (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as From e4a2ac99a71311ae06ecd1ba57f3da55088a7154 Mon Sep 17 00:00:00 2001 From: "ajay javiya (OpenERP)" Date: Mon, 6 Aug 2012 13:10:35 +0530 Subject: [PATCH 06/10] [IMP]:Improve translation synchronization bzr revid: aja@tinyerp.com-20120806074035-11pi9wal2psnvl6w --- addons/base_gengo/__init__.py | 5 +- addons/base_gengo/__openerp__.py | 5 +- addons/base_gengo/ir_translation.py | 5 +- addons/base_gengo/res_lang.py | 32 ++++ addons/base_gengo/res_lang_view.xml | 17 ++ addons/base_gengo/wizard/__init__.py | 26 +++ .../base_gengo/wizard/alert_message_gengo.xml | 22 +++ .../wizard/gengo_response_scheduler.xml | 26 +++ .../wizard/gengo_update_translation.py | 142 ++++++++++++++++ addons/base_gengo/wizard/wrap_object.py | 159 ++++++++++++++++++ 10 files changed, 434 insertions(+), 5 deletions(-) create mode 100644 addons/base_gengo/res_lang.py create mode 100644 addons/base_gengo/res_lang_view.xml create mode 100644 addons/base_gengo/wizard/__init__.py create mode 100644 addons/base_gengo/wizard/alert_message_gengo.xml create mode 100644 addons/base_gengo/wizard/gengo_response_scheduler.xml create mode 100644 addons/base_gengo/wizard/gengo_update_translation.py create mode 100644 addons/base_gengo/wizard/wrap_object.py diff --git a/addons/base_gengo/__init__.py b/addons/base_gengo/__init__.py index ca798adebee..c434c6b1843 100644 --- a/addons/base_gengo/__init__.py +++ b/addons/base_gengo/__init__.py @@ -11,7 +11,7 @@ # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License @@ -21,5 +21,6 @@ import res_company import ir_translation - +import wizard +import res_lang # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_gengo/__openerp__.py b/addons/base_gengo/__openerp__.py index 7afc573b0ca..e8fe7e0df17 100644 --- a/addons/base_gengo/__openerp__.py +++ b/addons/base_gengo/__openerp__.py @@ -31,7 +31,10 @@ Automated Translations through Gengo API 'init_xml': [], 'update_xml': [ 'ir_translation.xml', - 'res_company_view.xml' + 'res_company_view.xml', + 'res_lang_view.xml', + 'wizard/gengo_response_scheduler.xml', + 'wizard/alert_message_gengo.xml', ], 'demo_xml': [], 'test': [], diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index a658b935c93..2c1740b9b04 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -11,7 +11,7 @@ # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License @@ -29,8 +29,9 @@ class ir_translation(osv.Model): 'gengo_comment':fields.text("Comments"), 'gengo_translation':fields.boolean("Translation", help='This term has to be translated by Gengo automatically'), 'gengo_control':fields.boolean('Active'), + 'job_id':fields.char('Gengo Job Id',size=32), } - + _defaults = { 'gengo_control':False, } diff --git a/addons/base_gengo/res_lang.py b/addons/base_gengo/res_lang.py new file mode 100644 index 00000000000..48e5a6db995 --- /dev/null +++ b/addons/base_gengo/res_lang.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Business Applications +# Copyright (C) 2004-2012 OpenERP S.A. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import fields,osv + +class res_company(osv.Model): + _name = "res.lang" + _description = "Languages" + _inherit = "res.lang" + + _columns = { + 'gengo_sync':fields.boolean('Active', help='Synchronize Translation Periodically') + } + diff --git a/addons/base_gengo/res_lang_view.xml b/addons/base_gengo/res_lang_view.xml new file mode 100644 index 00000000000..efdfeed671e --- /dev/null +++ b/addons/base_gengo/res_lang_view.xml @@ -0,0 +1,17 @@ + + + + + + res.lang.form.inherit + + res.lang + form + + + + + + + + diff --git a/addons/base_gengo/wizard/__init__.py b/addons/base_gengo/wizard/__init__.py new file mode 100644 index 00000000000..fe8452a5b64 --- /dev/null +++ b/addons/base_gengo/wizard/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import gengo_update_translation +import wrap_object +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + + diff --git a/addons/base_gengo/wizard/alert_message_gengo.xml b/addons/base_gengo/wizard/alert_message_gengo.xml new file mode 100644 index 00000000000..9b16c34552f --- /dev/null +++ b/addons/base_gengo/wizard/alert_message_gengo.xml @@ -0,0 +1,22 @@ + + + + + update.translations.serial.wizard.view + + base.update.translations + form + + + + + + + + + + + + diff --git a/addons/base_gengo/wizard/gengo_response_scheduler.xml b/addons/base_gengo/wizard/gengo_response_scheduler.xml new file mode 100644 index 00000000000..f924dc5e4ee --- /dev/null +++ b/addons/base_gengo/wizard/gengo_response_scheduler.xml @@ -0,0 +1,26 @@ + + + + + + Run Gengo Response Scheduler + + 1 + minutes + -1 + + + + + + + Run Gengo Sync Request Scheduler + + 1 + days + -1 + + + + + diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py new file mode 100644 index 00000000000..a5186b4ab6d --- /dev/null +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -0,0 +1,142 @@ + # -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Business Applications +# Copyright (C) 2004-2012 OpenERP S.A. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import osv, fields +import tools +import cStringIO +from tools.translate import _ +import wrap_object +import logging +_logger = logging.getLogger(__name__) + +class gengo_update_translation(osv.osv_memory): + + def send_translation_terms(self, cr, uid, ids, context): + """Lasy Loading will be perform when user or cron send a bunch of request.""" + + total_term=0 + limit= 0 + translation_list=context['translation_term_id'] + range_jobs=1 + + meta = self.pool.get('jobs.meta') + translation_pool=self.pool.get('ir.translation') + user = self.pool.get('res.users').browse(cr, uid, uid, context) + gengo = meta.gengo_authentication(cr,uid,ids,context) + job_length=len(context['translation_term_id']) + remain=len(context['translation_term_id']) % wrap_object.REQUEST_LIMIT + if len(context['translation_term_id']) > wrap_object.REQUEST_LIMIT: + if remain > 0: + range_jobs=(len(context['translation_term_id']) / wrap_object.REQUEST_LIMIT) + 1 + else: + range_jobs=len(context['translation_term_id']) / wrap_object.REQUEST_LIMIT + for length in range(0,range_jobs): + trans_list=[] + if job_length > wrap_object.REQUEST_LIMIT: + job_length-=wrap_object.REQUEST_LIMIT + limit+=wrap_object.REQUEST_LIMIT + else: + limit+=remain + for key in translation_list[total_term:limit]: + trans_list.append(key) + total_term=limit + jobs = meta.pack_jobs_request(cr,uid,trans_list,context={'language_code':context['lang']}) + result = gengo.postTranslationJobs(jobs = jobs) + self.write(cr, uid, ids, {'state':'done'}) + if user.company_id.gengo_tier == 'machine': + if result.get('opstat')=='ok': + for job in result.get('response').get('jobs'): + for translation_id,val in job.items(): + translation_pool.write(cr,uid,int(translation_id),{'value': + val['body_tgt'],'state':'translated','gengo_control':True}) + else: + for job in result.get('response').get('jobs'): + for translation_id,val in job.items(): + translation_pool.write(cr,uid,int(translation_id),{'job_id':val['job_id']}) + return + + def act_update(self, cr, uid, ids, context=None): + try: + language_pool=self.pool.get('res.lang') + this = self.browse(cr, uid, ids)[0] + translation_pool=self.pool.get('ir.translation') + lang_search_id=language_pool.search(cr, uid, [('gengo_sync','=',True),('code','=',this.lang)]) + + if not lang_search_id: + translation_term_id=translation_pool.search(cr,uid,[('state','=','translate'), ('gengo_translation','=','True'),('lang','=',this.lang)]) + context.update({'lang':this.lang,'translation_term_id':translation_term_id}) + self.send_translation_terms(cr,uid,ids,context) + return + else: + self.write(cr, uid, ids, {'state':'inprogress'}) + except Exception, e: + raise osv.except_osv(_('Warning !'), _('%s') % e) + + def scheduler_get_gengo_response(self, cr, uid, ids=0, context=None): + """Scheduler will be call to get response from gengo and all term will get + by scheduler which terms are in reviewable state""" + + meta = self.pool.get('jobs.meta') + translation_pool=self.pool.get('ir.translation') + + gengo = meta.gengo_authentication(cr,uid,ids,context) + res = gengo.getTranslationJobs(status = "approved") + if res: + response = meta.unpack_jobs_response(res) + for job in response.response: + translation_id=translation_pool.search(cr,uid,[('job_id','=',job.job_id)],context) + response=gengo.getTranslationJob(id = job.job_id) + translation_pool.write(cr,uid,translation_id,{'value':response['response']['job']['body_tgt'],'state':'translated','gengo_control':True}) + + def scheduler_get_gengo_sync_request(self, cr, uid, ids=0, context=None): + """This scheduler will send a job request to the gengo , which terms are + in translate state and gengo_translation is true""" + + if context is None: + context={} + try: + language_pool=self.pool.get('res.lang') + translation_pool=self.pool.get('ir.translation') + + lang_search_id=language_pool.search(cr, uid, [('gengo_sync','=',True)]) + lang_ids=language_pool.read(cr, uid,lang_search_id) + + for lang_id in lang_ids: + translation_term_id=translation_pool.search(cr,uid,[('state','=','translate'), ('gengo_translation','=','True'),('lang','=',lang_id['code']),('job_id','=',False)]) + context.update({'lang':lang_id['code'],'translation_term_id':translation_term_id}) + if translation_term_id: + self.send_translation_terms(cr, uid, ids, context) + except Exception, e: + _logger.warning('A Gengo Exception is occur:: %s',e) + + _name = 'base.update.translations' + _inherit = "base.update.translations" + + _columns= { + 'state':fields.selection([('init','init'),('inprogress','inprogress'),('done','done')], 'state'), + } + + _defaults= { + 'state':'init', + } + +gengo_update_translation() + diff --git a/addons/base_gengo/wizard/wrap_object.py b/addons/base_gengo/wizard/wrap_object.py new file mode 100644 index 00000000000..51007bdbd71 --- /dev/null +++ b/addons/base_gengo/wizard/wrap_object.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Business Applications +# Copyright (C) 2004-2012 OpenERP S.A. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import orm, osv +import tools +from tools.translate import _ +from mygengo import MyGengo +import re + +REQUEST_LIMIT=10 + +LANG_MAPPING={ + 'ar':'Arabic', + 'id':'Indonesian', + 'nl':'Dutch', + 'fr-ca':'French (Canada)', + 'pl':'Polish', + 'zh-tw':'Chinese (Traditional)', + 'sv':'Swedish', + 'ko':'Korean', + 'pt':'Portuguese (Europe)', + 'en':'English', + 'ja':'Japanese', + 'es':'Spanish (Spain)', + 'zh':'Chinese (Simplified)', + 'de':'German', + 'fr':'French', + 'ru':'Russian', + 'it':'Italian', + 'pt-br':'Portuguese (Brazil)', +} + +LANG_CODE_MAPPING = { + 'ar_SA':'ar', + 'id_ID':'id', + 'nl_NL':'nl', + 'fr_CA':'fr-ca', + 'pl':'pl', + 'zh_TW':'zh-tw', + 'sv_SE':'sv', + 'ko_KR':'ko', + 'pt_PT':'pt', + 'en':'en', + 'ja_JP':'ja', + 'es_ES':'es', + 'zh_CN':'zh', + 'de_DE':'de', + 'fr_FR':'fr', + 'ru_RU':'ru', + 'it_IT':'it', + 'pt_BR':'pt-br' +} + +class gengo_response(object): + """ + """ + def __init__(self, jobs): + response = jobs['response'] + job = [] + jobs_id=[] + if isinstance(response, list): + job = [ gengo_job(value) for value in response] + else: + job = [ gengo_job(value) for value in response.values()] + jobs.update({'response': job}) + self._data = jobs + + def __getitem__(self, name): + return self._data[name] + + def __getattr__(self, name): + try: + return self[name] + except KeyError, e: + raise AttributeError(e) + +class gengo_job(object): + """ + """ + def __init__(self, job): + self._data = job + + def __getitem__(self, name): + return self._data[name] + + def __getattr__(self, name): + try: + return self[name] + except KeyError, e: + raise AttributeError(e) + +class JobsMeta(orm.AbstractModel): + + _name="jobs.meta" + + def gengo_authentication(self,cr,uid,ids,context=None): + ''' To Send Request and Get Response from Gengo User needs Public and Private + key for that user need to signup to gengo and get public and private + key which is provided by gengo to authentic user ''' + + gengo_parameter_pool=self.pool.get('res.users').browse(cr,uid,uid,context) + try: + gengo = MyGengo( + public_key = gengo_parameter_pool.company_id.gengo_public_key.encode('ascii'), + private_key = gengo_parameter_pool.company_id.gengo_private_key.encode('ascii'), + sandbox = True, + ) + return gengo + except Exception, e: + raise osv.except_osv(_('Warning !'), _(e)) + + def pack_jobs_request(self, cr, uid, translation_term_id, context): + jobs={} + auto_approve = 0 + gengo_parameter_pool=self.pool.get('res.users').browse(cr, uid, uid, context) + translation_pool =self.pool.get('ir.translation') + + if gengo_parameter_pool.company_id.gengo_auto_approve == True: + auto_approve=1 + + for key,value in LANG_CODE_MAPPING.items(): + if key == context['language_code']: + for terms in translation_pool.read(cr, uid, translation_term_id, context=None): +# translation_pool.write(cr,uid,translation_term_id,{'state':'inprogress'}) + if re.search(r"[a-z A-Z]",terms['src']): + job = {'type':'text', + 'slug':'single::English to '+ LANG_MAPPING.get(value), + 'tier':gengo_parameter_pool.company_id.gengo_tier, + 'body_src':terms['src'], + 'lc_src':'en', + 'lc_tgt':value, + 'auto_approve': auto_approve, + 'comment':gengo_parameter_pool.company_id.gengo_comment , + } + jobs.update({terms['id']: job}) + return {'jobs': jobs} + + def unpack_jobs_response(self, jobs): + return gengo_response(jobs) + + From 7187ef8bb4dad5cb6302f112e941139f68dcd0fa Mon Sep 17 00:00:00 2001 From: "ajay javiya (OpenERP)" Date: Mon, 6 Aug 2012 15:55:17 +0530 Subject: [PATCH 07/10] [IMP]: Improve in base_gengo as per pylint standard bzr revid: aja@tinyerp.com-20120806102517-tretlbhm2ydwetxi --- addons/base_gengo/ir_translation.py | 21 ++- addons/base_gengo/ir_translation.xml | 4 +- addons/base_gengo/res_company.py | 28 ++-- addons/base_gengo/res_company_view.xml | 2 +- addons/base_gengo/res_lang.py | 7 +- addons/base_gengo/res_lang_view.xml | 2 +- addons/base_gengo/wizard/__init__.py | 2 - .../base_gengo/wizard/alert_message_gengo.xml | 6 +- .../wizard/gengo_response_scheduler.xml | 4 +- .../wizard/gengo_update_translation.py | 133 +++++++-------- addons/base_gengo/wizard/wrap_object.py | 156 +++++++++--------- 11 files changed, 178 insertions(+), 187 deletions(-) diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index 2c1740b9b04..297e449ecdc 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -19,20 +19,19 @@ # ############################################################################## -from osv import fields,osv +from osv import fields, osv + class ir_translation(osv.Model): _name = "ir.translation" - _description="Translation" - _inherit="ir.translation" + _inherit = "ir.translation" _columns = { - 'gengo_comment':fields.text("Comments"), - 'gengo_translation':fields.boolean("Translation", help='This term has to be translated by Gengo automatically'), - 'gengo_control':fields.boolean('Active'), - 'job_id':fields.char('Gengo Job Id',size=32), - } - - _defaults = { - 'gengo_control':False, + 'gengo_comment': fields.text("Comments"), + 'gengo_translation': fields.boolean("Translation", help='This term has to be translated by Gengo automatically'), + 'gengo_control': fields.boolean('Active'), + 'job_id': fields.char('Gengo Job Id', size=32), } + _defaults = { + 'gengo_control': False, + } diff --git a/addons/base_gengo/ir_translation.xml b/addons/base_gengo/ir_translation.xml index 52b081cd7d6..753c12c7e7d 100644 --- a/addons/base_gengo/ir_translation.xml +++ b/addons/base_gengo/ir_translation.xml @@ -13,12 +13,12 @@ - + ir.translation.form.inherit - ir.translation + ir.translation form diff --git a/addons/base_gengo/res_company.py b/addons/base_gengo/res_company.py index 2a91d13f1b1..888e675e26b 100644 --- a/addons/base_gengo/res_company.py +++ b/addons/base_gengo/res_company.py @@ -19,24 +19,24 @@ # ############################################################################## -from osv import fields,osv +from osv import fields, osv + class res_company(osv.Model): _name = "res.company" - _description = "Companies" _inherit = "res.company" _columns = { - "gengo_private_key":fields.text("Gengo private key"), - "gengo_public_key":fields.text("Gengo public key"), - "gengo_tier":fields.selection([('machine','Machine'), - ('standard','Standard'), - ('pro','Pro'), - ('ultra','Ultra')],"Tier types", required=True), - "gengo_comment":fields.text("comments"), - "gengo_auto_approve":fields.boolean("Active",help="Jobs are Automatically Approved by Gengo."), - "fields_ids":fields.many2many('ir.model.fields','fields_company_rel','field_id','model_id','fields'), + "gengo_private_key": fields.text("Gengo private key"), + "gengo_public_key": fields.text("Gengo public key"), + "gengo_tier": fields.selection([('machine', 'Machine'), + ('standard', 'Standard'), + ('pro', 'Pro'), + ('ultra', 'Ultra')], "Tier types", required=True), + "gengo_comment": fields.text("comments"), + "gengo_auto_approve": fields.boolean("Active", help="Jobs are Automatically Approved by Gengo."), + "fields_ids": fields.many2many('ir.model.fields', 'fields_company_rel', 'field_id', 'model_id', 'fields'), } - - _defaults={ - "gengo_tier":"machine", + + _defaults = { + "gengo_tier": "machine", } diff --git a/addons/base_gengo/res_company_view.xml b/addons/base_gengo/res_company_view.xml index a4f6ceffcce..bfa0b1ddf95 100644 --- a/addons/base_gengo/res_company_view.xml +++ b/addons/base_gengo/res_company_view.xml @@ -5,7 +5,7 @@ res.company.form.inherit - res.company + res.company form diff --git a/addons/base_gengo/res_lang.py b/addons/base_gengo/res_lang.py index 48e5a6db995..e9c88c9fd29 100644 --- a/addons/base_gengo/res_lang.py +++ b/addons/base_gengo/res_lang.py @@ -19,14 +19,13 @@ # ############################################################################## -from osv import fields,osv +from osv import fields, osv + class res_company(osv.Model): _name = "res.lang" - _description = "Languages" _inherit = "res.lang" _columns = { - 'gengo_sync':fields.boolean('Active', help='Synchronize Translation Periodically') + 'gengo_sync': fields.boolean('Active', help='Synchronize Translation Periodically') } - diff --git a/addons/base_gengo/res_lang_view.xml b/addons/base_gengo/res_lang_view.xml index efdfeed671e..e0c8edd11aa 100644 --- a/addons/base_gengo/res_lang_view.xml +++ b/addons/base_gengo/res_lang_view.xml @@ -5,7 +5,7 @@ res.lang.form.inherit - res.lang + res.lang form diff --git a/addons/base_gengo/wizard/__init__.py b/addons/base_gengo/wizard/__init__.py index fe8452a5b64..e7935ca8b1c 100644 --- a/addons/base_gengo/wizard/__init__.py +++ b/addons/base_gengo/wizard/__init__.py @@ -22,5 +22,3 @@ import gengo_update_translation import wrap_object # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - - diff --git a/addons/base_gengo/wizard/alert_message_gengo.xml b/addons/base_gengo/wizard/alert_message_gengo.xml index 9b16c34552f..304175db031 100644 --- a/addons/base_gengo/wizard/alert_message_gengo.xml +++ b/addons/base_gengo/wizard/alert_message_gengo.xml @@ -7,16 +7,16 @@ base.update.translations form - + + - + diff --git a/addons/base_gengo/wizard/gengo_response_scheduler.xml b/addons/base_gengo/wizard/gengo_response_scheduler.xml index f924dc5e4ee..544235d8a6f 100644 --- a/addons/base_gengo/wizard/gengo_response_scheduler.xml +++ b/addons/base_gengo/wizard/gengo_response_scheduler.xml @@ -6,12 +6,12 @@ Run Gengo Response Scheduler 1 - minutes + days -1 - + Run Gengo Sync Request Scheduler diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index a5186b4ab6d..1a5c90edb0a 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -20,123 +20,118 @@ ############################################################################## from osv import osv, fields -import tools -import cStringIO from tools.translate import _ import wrap_object import logging _logger = logging.getLogger(__name__) + class gengo_update_translation(osv.osv_memory): def send_translation_terms(self, cr, uid, ids, context): """Lasy Loading will be perform when user or cron send a bunch of request.""" - - total_term=0 - limit= 0 - translation_list=context['translation_term_id'] - range_jobs=1 - + total_term = 0 + limit = 0 + translation_list = context['translation_term_id'] + range_jobs = 1 meta = self.pool.get('jobs.meta') - translation_pool=self.pool.get('ir.translation') + translation_pool = self.pool.get('ir.translation') user = self.pool.get('res.users').browse(cr, uid, uid, context) - gengo = meta.gengo_authentication(cr,uid,ids,context) - job_length=len(context['translation_term_id']) - remain=len(context['translation_term_id']) % wrap_object.REQUEST_LIMIT + gengo = meta.gengo_authentication(cr, uid, ids, context) + job_length = len(context['translation_term_id']) + remain = len(context['translation_term_id']) % wrap_object.REQUEST_LIMIT if len(context['translation_term_id']) > wrap_object.REQUEST_LIMIT: if remain > 0: - range_jobs=(len(context['translation_term_id']) / wrap_object.REQUEST_LIMIT) + 1 + range_jobs = (len(context['translation_term_id']) / wrap_object.REQUEST_LIMIT) + 1 else: - range_jobs=len(context['translation_term_id']) / wrap_object.REQUEST_LIMIT - for length in range(0,range_jobs): - trans_list=[] + range_jobs = len(context['translation_term_id']) / wrap_object.REQUEST_LIMIT + for length in range(0, range_jobs): + trans_list = [] if job_length > wrap_object.REQUEST_LIMIT: - job_length-=wrap_object.REQUEST_LIMIT - limit+=wrap_object.REQUEST_LIMIT + job_length -= wrap_object.REQUEST_LIMIT + limit += wrap_object.REQUEST_LIMIT else: - limit+=remain + limit += remain for key in translation_list[total_term:limit]: trans_list.append(key) - total_term=limit - jobs = meta.pack_jobs_request(cr,uid,trans_list,context={'language_code':context['lang']}) - result = gengo.postTranslationJobs(jobs = jobs) - self.write(cr, uid, ids, {'state':'done'}) + total_term = limit + jobs = meta.pack_jobs_request(cr, uid, trans_list, context={'language_code': context['lang']}) + result = gengo.postTranslationJobs(jobs=jobs) + self.write(cr, uid, ids, {'state': 'done'}) if user.company_id.gengo_tier == 'machine': - if result.get('opstat')=='ok': - for job in result.get('response').get('jobs'): - for translation_id,val in job.items(): - translation_pool.write(cr,uid,int(translation_id),{'value': - val['body_tgt'],'state':'translated','gengo_control':True}) + if result.get('opstat') == 'ok': + for job in result.get('response').get('jobs'): + for translation_id, val in job.items(): + translation_pool.write(cr, uid, int(translation_id), {'value': + val['body_tgt'], 'state': 'translated', 'gengo_control': True}) else: for job in result.get('response').get('jobs'): - for translation_id,val in job.items(): - translation_pool.write(cr,uid,int(translation_id),{'job_id':val['job_id']}) + for translation_id, val in job.items(): + translation_pool.write(cr, uid, int(translation_id), {'job_id': val['job_id']}) return - + def act_update(self, cr, uid, ids, context=None): try: - language_pool=self.pool.get('res.lang') + language_pool = self.pool.get('res.lang') this = self.browse(cr, uid, ids)[0] - translation_pool=self.pool.get('ir.translation') - lang_search_id=language_pool.search(cr, uid, [('gengo_sync','=',True),('code','=',this.lang)]) - + translation_pool = self.pool.get('ir.translation') + lang_search_id = language_pool.search(cr, uid, + [('gengo_sync', '=', True), ('code', '=', this.lang)]) + if not lang_search_id: - translation_term_id=translation_pool.search(cr,uid,[('state','=','translate'), ('gengo_translation','=','True'),('lang','=',this.lang)]) - context.update({'lang':this.lang,'translation_term_id':translation_term_id}) - self.send_translation_terms(cr,uid,ids,context) + translation_term_id = translation_pool.search(cr, uid, [('state', '=', 'translate'), ('gengo_translation', '=', 'True'), ('lang', '=', this.lang)]) + context.update({'lang': this.lang, 'translation_term_id': translation_term_id}) + self.send_translation_terms(cr, uid, ids, context) return else: - self.write(cr, uid, ids, {'state':'inprogress'}) + self.write(cr, uid, ids, {'state': 'inprogress'}) except Exception, e: raise osv.except_osv(_('Warning !'), _('%s') % e) - + def scheduler_get_gengo_response(self, cr, uid, ids=0, context=None): - """Scheduler will be call to get response from gengo and all term will get + """Scheduler will be call to get response from gengo and all term will get by scheduler which terms are in reviewable state""" - + meta = self.pool.get('jobs.meta') - translation_pool=self.pool.get('ir.translation') - - gengo = meta.gengo_authentication(cr,uid,ids,context) - res = gengo.getTranslationJobs(status = "approved") + translation_pool = self.pool.get('ir.translation') + gengo = meta.gengo_authentication(cr, uid, ids, context) + res = gengo.getTranslationJobs(status="approved") if res: response = meta.unpack_jobs_response(res) for job in response.response: - translation_id=translation_pool.search(cr,uid,[('job_id','=',job.job_id)],context) - response=gengo.getTranslationJob(id = job.job_id) - translation_pool.write(cr,uid,translation_id,{'value':response['response']['job']['body_tgt'],'state':'translated','gengo_control':True}) - + translation_id = translation_pool.search(cr, uid, [('job_id', '=', job.job_id)], context) + response = gengo.getTranslationJob(id=job.job_id) + translation_pool.write(cr, uid, translation_id, {'value': response['response']['job']['body_tgt'], 'state': 'translated', 'gengo_control': True}) + def scheduler_get_gengo_sync_request(self, cr, uid, ids=0, context=None): - """This scheduler will send a job request to the gengo , which terms are + """This scheduler will send a job request to the gengo , which terms are in translate state and gengo_translation is true""" - + if context is None: - context={} + context = {} try: - language_pool=self.pool.get('res.lang') - translation_pool=self.pool.get('ir.translation') - - lang_search_id=language_pool.search(cr, uid, [('gengo_sync','=',True)]) - lang_ids=language_pool.read(cr, uid,lang_search_id) - + language_pool = self.pool.get('res.lang') + translation_pool = self.pool.get('ir.translation') + lang_search_id = language_pool.search(cr, uid, [('gengo_sync', '=', True)]) + lang_ids = language_pool.read(cr, uid, lang_search_id) + for lang_id in lang_ids: - translation_term_id=translation_pool.search(cr,uid,[('state','=','translate'), ('gengo_translation','=','True'),('lang','=',lang_id['code']),('job_id','=',False)]) - context.update({'lang':lang_id['code'],'translation_term_id':translation_term_id}) + translation_term_id = translation_pool.search(cr, uid, [('state', '=', 'translate'), ('gengo_translation', '=', 'True'), ('lang', '=', lang_id['code']), ('job_id', '=', False)]) + context.update({'lang': lang_id['code'], 'translation_term_id': translation_term_id}) if translation_term_id: self.send_translation_terms(cr, uid, ids, context) except Exception, e: - _logger.warning('A Gengo Exception is occur:: %s',e) + _logger.warning('A Gengo Exception is occur:: %s', e) _name = 'base.update.translations' _inherit = "base.update.translations" - - _columns= { - 'state':fields.selection([('init','init'),('inprogress','inprogress'),('done','done')], 'state'), + _columns = { + 'state': fields.selection([('init', 'init'), ('inprogress', 'inprogress'), ('done', 'done')], 'state'), } - - _defaults= { - 'state':'init', + + _defaults = { + 'state': 'init', } gengo_update_translation() - +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_gengo/wizard/wrap_object.py b/addons/base_gengo/wizard/wrap_object.py index 51007bdbd71..01368e5e2cb 100644 --- a/addons/base_gengo/wizard/wrap_object.py +++ b/addons/base_gengo/wizard/wrap_object.py @@ -20,66 +20,65 @@ ############################################################################## from osv import orm, osv -import tools from tools.translate import _ from mygengo import MyGengo import re -REQUEST_LIMIT=10 +REQUEST_LIMIT = 10 -LANG_MAPPING={ - 'ar':'Arabic', - 'id':'Indonesian', - 'nl':'Dutch', - 'fr-ca':'French (Canada)', - 'pl':'Polish', - 'zh-tw':'Chinese (Traditional)', - 'sv':'Swedish', - 'ko':'Korean', - 'pt':'Portuguese (Europe)', - 'en':'English', - 'ja':'Japanese', - 'es':'Spanish (Spain)', - 'zh':'Chinese (Simplified)', - 'de':'German', - 'fr':'French', - 'ru':'Russian', - 'it':'Italian', - 'pt-br':'Portuguese (Brazil)', +LANG_MAPPING = { + 'ar': 'Arabic', + 'id': 'Indonesian', + 'nl': 'Dutch', + 'fr-ca': 'French (Canada)', + 'pl': 'Polish', + 'zh-tw': 'Chinese (Traditional)', + 'sv': 'Swedish', + 'ko': 'Korean', + 'pt': 'Portuguese (Europe)', + 'en': 'English', + 'ja': 'Japanese', + 'es': 'Spanish (Spain)', + 'zh': 'Chinese (Simplified)', + 'de': 'German', + 'fr': 'French', + 'ru': 'Russian', + 'it': 'Italian', + 'pt-br': 'Portuguese (Brazil)', } LANG_CODE_MAPPING = { - 'ar_SA':'ar', - 'id_ID':'id', - 'nl_NL':'nl', - 'fr_CA':'fr-ca', - 'pl':'pl', - 'zh_TW':'zh-tw', - 'sv_SE':'sv', - 'ko_KR':'ko', - 'pt_PT':'pt', - 'en':'en', - 'ja_JP':'ja', - 'es_ES':'es', - 'zh_CN':'zh', - 'de_DE':'de', - 'fr_FR':'fr', - 'ru_RU':'ru', - 'it_IT':'it', - 'pt_BR':'pt-br' + 'ar_SA': 'ar', + 'id_ID': 'id', + 'nl_NL': 'nl', + 'fr_CA': 'fr-ca', + 'pl': 'pl', + 'zh_TW': 'zh-tw', + 'sv_SE': 'sv', + 'ko_KR': 'ko', + 'pt_PT': 'pt', + 'en': 'en', + 'ja_JP': 'ja', + 'es_ES': 'es', + 'zh_CN': 'zh', + 'de_DE': 'de', + 'fr_FR': 'fr', + 'ru_RU': 'ru', + 'it_IT': 'it', + 'pt_BR': 'pt-br' } + class gengo_response(object): - """ + """ """ def __init__(self, jobs): - response = jobs['response'] + response = jobs['response'] job = [] - jobs_id=[] if isinstance(response, list): - job = [ gengo_job(value) for value in response] + job = [gengo_job(value) for value in response] else: - job = [ gengo_job(value) for value in response.values()] + job = [gengo_job(value) for value in response.values()] jobs.update({'response': job}) self._data = jobs @@ -92,8 +91,9 @@ class gengo_response(object): except KeyError, e: raise AttributeError(e) + class gengo_job(object): - """ + """ """ def __init__(self, job): self._data = job @@ -107,53 +107,53 @@ class gengo_job(object): except KeyError, e: raise AttributeError(e) + class JobsMeta(orm.AbstractModel): - - _name="jobs.meta" - - def gengo_authentication(self,cr,uid,ids,context=None): + + _name = "jobs.meta" + + def gengo_authentication(self, cr, uid, ids, context=None): ''' To Send Request and Get Response from Gengo User needs Public and Private - key for that user need to signup to gengo and get public and private + key for that user need to signup to gengo and get public and private key which is provided by gengo to authentic user ''' - - gengo_parameter_pool=self.pool.get('res.users').browse(cr,uid,uid,context) + + gengo_parameter_pool = self.pool.get('res.users').browse(cr, uid, uid, context) try: gengo = MyGengo( - public_key = gengo_parameter_pool.company_id.gengo_public_key.encode('ascii'), - private_key = gengo_parameter_pool.company_id.gengo_private_key.encode('ascii'), - sandbox = True, + public_key=gengo_parameter_pool.company_id.gengo_public_key.encode('ascii'), + private_key=gengo_parameter_pool.company_id.gengo_private_key.encode('ascii'), + sandbox=True, ) return gengo except Exception, e: raise osv.except_osv(_('Warning !'), _(e)) - - def pack_jobs_request(self, cr, uid, translation_term_id, context): - jobs={} - auto_approve = 0 - gengo_parameter_pool=self.pool.get('res.users').browse(cr, uid, uid, context) - translation_pool =self.pool.get('ir.translation') - - if gengo_parameter_pool.company_id.gengo_auto_approve == True: - auto_approve=1 - for key,value in LANG_CODE_MAPPING.items(): + def pack_jobs_request(self, cr, uid, translation_term_id, context): + jobs = {} + auto_approve = 0 + gengo_parameter_pool = self.pool.get('res.users').browse(cr, uid, uid, context) + translation_pool = self.pool.get('ir.translation') + + if gengo_parameter_pool.company_id.gengo_auto_approve == True: + auto_approve = 1 + + for key, value in LANG_CODE_MAPPING.items(): if key == context['language_code']: for terms in translation_pool.read(cr, uid, translation_term_id, context=None): -# translation_pool.write(cr,uid,translation_term_id,{'state':'inprogress'}) - if re.search(r"[a-z A-Z]",terms['src']): - job = {'type':'text', - 'slug':'single::English to '+ LANG_MAPPING.get(value), - 'tier':gengo_parameter_pool.company_id.gengo_tier, - 'body_src':terms['src'], - 'lc_src':'en', - 'lc_tgt':value, - 'auto_approve': auto_approve, - 'comment':gengo_parameter_pool.company_id.gengo_comment , + translation_pool.write(cr, uid, translation_term_id, {'state': 'inprogress'}) + if re.search(r"[a-z A-Z]", terms['src']): + job = {'type': 'text', + 'slug': 'single::English to' + LANG_MAPPING.get(value), + 'tier': gengo_parameter_pool.company_id.gengo_tier, + 'body_src': terms['src'], + 'lc_src': 'en', + 'lc_tgt': value, + 'auto_approve': auto_approve, + 'comment': gengo_parameter_pool.company_id.gengo_comment, } jobs.update({terms['id']: job}) return {'jobs': jobs} - + def unpack_jobs_response(self, jobs): return gengo_response(jobs) - - +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From b3079507cd79db087192fff373296702b51ccd01 Mon Sep 17 00:00:00 2001 From: "ajay javiya (OpenERP)" Date: Fri, 17 Aug 2012 11:57:30 +0530 Subject: [PATCH 08/10] [IMP]: Improve in gengo_update_translation method bzr revid: aja@tinyerp.com-20120817062730-r3mfsyinj3acdxqn --- addons/base_gengo/ir_translation.py | 1 - addons/base_gengo/wizard/__init__.py | 1 + .../base_gengo/wizard/alert_message_gengo.xml | 20 +++--- .../base_gengo/wizard/gengo_update_message.py | 44 +++++++++++++ .../wizard/gengo_update_translation.py | 65 ++++++++++--------- 5 files changed, 87 insertions(+), 44 deletions(-) create mode 100644 addons/base_gengo/wizard/gengo_update_message.py diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index 297e449ecdc..e4ba7716686 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -29,7 +29,6 @@ class ir_translation(osv.Model): 'gengo_comment': fields.text("Comments"), 'gengo_translation': fields.boolean("Translation", help='This term has to be translated by Gengo automatically'), 'gengo_control': fields.boolean('Active'), - 'job_id': fields.char('Gengo Job Id', size=32), } _defaults = { diff --git a/addons/base_gengo/wizard/__init__.py b/addons/base_gengo/wizard/__init__.py index e7935ca8b1c..ef9652d93a6 100644 --- a/addons/base_gengo/wizard/__init__.py +++ b/addons/base_gengo/wizard/__init__.py @@ -21,4 +21,5 @@ import gengo_update_translation import wrap_object +import gengo_update_message # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_gengo/wizard/alert_message_gengo.xml b/addons/base_gengo/wizard/alert_message_gengo.xml index 304175db031..84bfc7bb484 100644 --- a/addons/base_gengo/wizard/alert_message_gengo.xml +++ b/addons/base_gengo/wizard/alert_message_gengo.xml @@ -1,21 +1,17 @@ + - update.translations.serial.wizard.view - - base.update.translations + gengo.update.message.form + gengo.update.message form - - - - - - - +
+ + + +
diff --git a/addons/base_gengo/wizard/gengo_update_message.py b/addons/base_gengo/wizard/gengo_update_message.py new file mode 100644 index 00000000000..214b9978a19 --- /dev/null +++ b/addons/base_gengo/wizard/gengo_update_message.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import osv +from osv import fields + + +class gengo_update_message(osv.osv): + """Update Message""" + + _name = "gengo.update.message" + _description = "Update Message" + _columns = { + 'name': fields.text('Message', readonly=True), + } + + def default_get(self, cr, uid, fields, context=None): + if context == None: + context = {} + res = super(gengo_update_message, self).default_get(cr, uid, fields, context=context) + res.update({'name': context.get('message')}) + return res + +gengo_update_message() + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index 1a5c90edb0a..76ac7baa980 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -1,4 +1,4 @@ - # -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Business Applications @@ -19,8 +19,7 @@ # ############################################################################## -from osv import osv, fields -from tools.translate import _ +from osv import osv import wrap_object import logging _logger = logging.getLogger(__name__) @@ -55,22 +54,19 @@ class gengo_update_translation(osv.osv_memory): for key in translation_list[total_term:limit]: trans_list.append(key) total_term = limit - jobs = meta.pack_jobs_request(cr, uid, trans_list, context={'language_code': context['lang']}) - result = gengo.postTranslationJobs(jobs=jobs) - self.write(cr, uid, ids, {'state': 'done'}) + request = meta.pack_jobs_request(cr, uid, trans_list, context={'language_code': context['lang']}) + result = gengo.postTranslationJobs(jobs=request) if user.company_id.gengo_tier == 'machine': - if result.get('opstat') == 'ok': - for job in result.get('response').get('jobs'): - for translation_id, val in job.items(): - translation_pool.write(cr, uid, int(translation_id), {'value': - val['body_tgt'], 'state': 'translated', 'gengo_control': True}) - else: - for job in result.get('response').get('jobs'): - for translation_id, val in job.items(): - translation_pool.write(cr, uid, int(translation_id), {'job_id': val['job_id']}) - return + response = meta.unpack_jobs_response(result) + for job in response.response[1]: + for jobs in job: + translation_term_id = translation_pool.search(cr, uid, [('src', '=', job[jobs]['body_src'])]) + translation_pool.write(cr, uid, translation_term_id, {'value': job[jobs]['body_tgt'], 'state': 'translated', 'gengo_control': True}) + return def act_update(self, cr, uid, ids, context=None): + if context == None: + context={} try: language_pool = self.pool.get('res.lang') this = self.browse(cr, uid, ids)[0] @@ -82,16 +78,29 @@ class gengo_update_translation(osv.osv_memory): translation_term_id = translation_pool.search(cr, uid, [('state', '=', 'translate'), ('gengo_translation', '=', 'True'), ('lang', '=', this.lang)]) context.update({'lang': this.lang, 'translation_term_id': translation_term_id}) self.send_translation_terms(cr, uid, ids, context) - return + msg = "Your Request has been Successfully Send to Gengo" else: - self.write(cr, uid, ids, {'state': 'inprogress'}) + msg = "This language is select as Active All Translation Request will be sent by System Automatically" + except Exception, e: - raise osv.except_osv(_('Warning !'), _('%s') % e) + msg = '%s' % e + context.update({'message': msg}) + obj_model = self.pool.get('ir.model.data') + model_data_ids = obj_model.search(cr, uid, [('model', '=', 'ir.ui.view'), ('name', '=', 'update_translation_wizard_view_confirm')]) + resource_id = obj_model.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id'] + return { + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'gengo.update.message', + 'views': [(resource_id, 'form')], + 'type': 'ir.actions.act_window', + 'target': 'new', + 'context': context, + } def scheduler_get_gengo_response(self, cr, uid, ids=0, context=None): """Scheduler will be call to get response from gengo and all term will get by scheduler which terms are in reviewable state""" - meta = self.pool.get('jobs.meta') translation_pool = self.pool.get('ir.translation') gengo = meta.gengo_authentication(cr, uid, ids, context) @@ -99,9 +108,10 @@ class gengo_update_translation(osv.osv_memory): if res: response = meta.unpack_jobs_response(res) for job in response.response: - translation_id = translation_pool.search(cr, uid, [('job_id', '=', job.job_id)], context) - response = gengo.getTranslationJob(id=job.job_id) - translation_pool.write(cr, uid, translation_id, {'value': response['response']['job']['body_tgt'], 'state': 'translated', 'gengo_control': True}) + job_response=gengo.getTranslationJob(id=job['job_id']) + jobs_response = meta.unpack_jobs_response(job_response) + translation_id = translation_pool.search(cr, uid, [('src', '=', jobs_response.response[0]['body_src'])], context) + translation_pool.write(cr, uid, translation_id, {'value': jobs_response.response[0]['body_tgt'], 'state': 'translated', 'gengo_control': True}) def scheduler_get_gengo_sync_request(self, cr, uid, ids=0, context=None): """This scheduler will send a job request to the gengo , which terms are @@ -116,7 +126,7 @@ class gengo_update_translation(osv.osv_memory): lang_ids = language_pool.read(cr, uid, lang_search_id) for lang_id in lang_ids: - translation_term_id = translation_pool.search(cr, uid, [('state', '=', 'translate'), ('gengo_translation', '=', 'True'), ('lang', '=', lang_id['code']), ('job_id', '=', False)]) + translation_term_id = translation_pool.search(cr, uid, [('state', '=', 'translate'), ('gengo_translation', '=', 'True'), ('lang', '=', lang_id['code'])]) context.update({'lang': lang_id['code'], 'translation_term_id': translation_term_id}) if translation_term_id: self.send_translation_terms(cr, uid, ids, context) @@ -125,13 +135,6 @@ class gengo_update_translation(osv.osv_memory): _name = 'base.update.translations' _inherit = "base.update.translations" - _columns = { - 'state': fields.selection([('init', 'init'), ('inprogress', 'inprogress'), ('done', 'done')], 'state'), - } - - _defaults = { - 'state': 'init', - } gengo_update_translation() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From bc0b3c6cc5ed58c141989d547613ae353afe7750 Mon Sep 17 00:00:00 2001 From: "ajay javiya (OpenERP)" Date: Thu, 23 Aug 2012 19:12:57 +0530 Subject: [PATCH 09/10] [IMP]: improve in base_gengo sync and add schedular for response and request of terms bzr revid: aja@tinyerp.com-20120823134257-37tzof2yiwfnsr1e --- addons/base_gengo/__openerp__.py | 4 +- .../base_gengo/gengo_sync_schedular_data.xml | 26 +++ addons/base_gengo/ir_translation.py | 1 + .../wizard/gengo_response_scheduler.xml | 26 --- .../wizard/gengo_update_translation.py | 159 ++++++++---------- addons/base_gengo/wizard/wrap_object.py | 51 +++--- 6 files changed, 120 insertions(+), 147 deletions(-) create mode 100644 addons/base_gengo/gengo_sync_schedular_data.xml delete mode 100644 addons/base_gengo/wizard/gengo_response_scheduler.xml diff --git a/addons/base_gengo/__openerp__.py b/addons/base_gengo/__openerp__.py index e8fe7e0df17..1173d513493 100644 --- a/addons/base_gengo/__openerp__.py +++ b/addons/base_gengo/__openerp__.py @@ -28,12 +28,12 @@ Automated Translations through Gengo API 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base'], - 'init_xml': [], + 'init_xml': ['gengo_sync_schedular_data.xml'], 'update_xml': [ 'ir_translation.xml', 'res_company_view.xml', 'res_lang_view.xml', - 'wizard/gengo_response_scheduler.xml', + 'wizard/alert_message_gengo.xml', ], 'demo_xml': [], diff --git a/addons/base_gengo/gengo_sync_schedular_data.xml b/addons/base_gengo/gengo_sync_schedular_data.xml new file mode 100644 index 00000000000..ab78b59e0b8 --- /dev/null +++ b/addons/base_gengo/gengo_sync_schedular_data.xml @@ -0,0 +1,26 @@ + + + + + + Gengo Sync Translation (Response) + + 30 + minutes + -1 + + + + + + + Gengo Sync Translation (Request) + + 30 + minutes + -1 + + + + + diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index e4ba7716686..7bda5023592 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -29,6 +29,7 @@ class ir_translation(osv.Model): 'gengo_comment': fields.text("Comments"), 'gengo_translation': fields.boolean("Translation", help='This term has to be translated by Gengo automatically'), 'gengo_control': fields.boolean('Active'), + 'job_id':fields.char('Gengo Job Id',size=32), } _defaults = { diff --git a/addons/base_gengo/wizard/gengo_response_scheduler.xml b/addons/base_gengo/wizard/gengo_response_scheduler.xml deleted file mode 100644 index 544235d8a6f..00000000000 --- a/addons/base_gengo/wizard/gengo_response_scheduler.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Run Gengo Response Scheduler - - 1 - days - -1 - - - - - - - Run Gengo Sync Request Scheduler - - 1 - days - -1 - - - - - diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index 76ac7baa980..d54358c32d9 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -20,121 +20,104 @@ ############################################################################## from osv import osv -import wrap_object +import wrap_object as local import logging _logger = logging.getLogger(__name__) +cron_vals = { +'name': 'Gengo Sync', +'active': True, +'interval_number': 30, +'interval_type': 'minutes', +'numbercall': -1, +'model': "'base.update.translations'", +'function': "" +} -class gengo_update_translation(osv.osv_memory): - def send_translation_terms(self, cr, uid, ids, context): - """Lasy Loading will be perform when user or cron send a bunch of request.""" - total_term = 0 - limit = 0 - translation_list = context['translation_term_id'] - range_jobs = 1 - meta = self.pool.get('jobs.meta') +class base_update_translation(osv.osv_memory): + def _update_terms(self, cr, uid, ids, response, tier, context): translation_pool = self.pool.get('ir.translation') + for jobs in response['jobs']: + vals = {} + for t_id, res in jobs.items(): + 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) + return + + + def _send_translation_terms(self, cr, uid, ids, trg_lang, term_ids, context): + """ + Lazy Polling will be perform when user or cron request for the trnalstion. + """ + meta = self.pool.get('jobs.meta') user = self.pool.get('res.users').browse(cr, uid, uid, context) gengo = meta.gengo_authentication(cr, uid, ids, context) - job_length = len(context['translation_term_id']) - remain = len(context['translation_term_id']) % wrap_object.REQUEST_LIMIT - if len(context['translation_term_id']) > wrap_object.REQUEST_LIMIT: - if remain > 0: - range_jobs = (len(context['translation_term_id']) / wrap_object.REQUEST_LIMIT) + 1 - else: - range_jobs = len(context['translation_term_id']) / wrap_object.REQUEST_LIMIT - for length in range(0, range_jobs): - trans_list = [] - if job_length > wrap_object.REQUEST_LIMIT: - job_length -= wrap_object.REQUEST_LIMIT - limit += wrap_object.REQUEST_LIMIT - else: - limit += remain - for key in translation_list[total_term:limit]: - trans_list.append(key) - total_term = limit - request = meta.pack_jobs_request(cr, uid, trans_list, context={'language_code': context['lang']}) - result = gengo.postTranslationJobs(jobs=request) - if user.company_id.gengo_tier == 'machine': - response = meta.unpack_jobs_response(result) - for job in response.response[1]: - for jobs in job: - translation_term_id = translation_pool.search(cr, uid, [('src', '=', job[jobs]['body_src'])]) - translation_pool.write(cr, uid, translation_term_id, {'value': job[jobs]['body_tgt'], 'state': 'translated', 'gengo_control': True}) - return + request = meta.pack_jobs_request(cr, uid, term_ids, trg_lang, context) + result = gengo.postTranslationJobs(jobs=request) + if result['opstat'] == 'ok': + self._update_terms(cr, uid, ids, result['response'], user.company_id.gengo_tier, context) + return True + + def do_check_schedular(self, cr, uid, xml_id, name, fn, context=None): + cron_pool = self.pool.get('ir.cron') + try: + res = self.pool.get('ir.model.data')._get_id(cr, uid, 'base_gengo', xml_id) + cron_pool.write(cr, uid, [res], {'active': True}, context) + except: + cron_vals.update({'name': name, "function": fn}) + return cron_pool.create(cr, uid, cron_vals, context) def act_update(self, cr, uid, ids, context=None): if context == None: - context={} - try: - language_pool = self.pool.get('res.lang') - this = self.browse(cr, uid, ids)[0] - translation_pool = self.pool.get('ir.translation') - lang_search_id = language_pool.search(cr, uid, - [('gengo_sync', '=', True), ('code', '=', this.lang)]) + context = {} + lang_pool = self.pool.get('res.lang') + for res in self.browse(cr, uid, ids, context): + lang_id = lang_pool.search(cr, uid, [('code', '=', res.lang)]) + lang_pool.write(cr, uid, lang_id, {'gengo_sync': True}) + res = super(base_update_translation, self).act_update(cr, uid, ids, context) + self.do_check_schedular(cr, uid, 'gengo_sync_send_request_scheduler', 'gengo_sync_send_request_scheduler', '_sync_request', context) + self.do_check_schedular(cr, uid, 'gengo_sync_receive_request_scheduler', 'gengo_sync_send_request_scheduler', '_sync_response', context) + return {} - if not lang_search_id: - translation_term_id = translation_pool.search(cr, uid, [('state', '=', 'translate'), ('gengo_translation', '=', 'True'), ('lang', '=', this.lang)]) - context.update({'lang': this.lang, 'translation_term_id': translation_term_id}) - self.send_translation_terms(cr, uid, ids, context) - msg = "Your Request has been Successfully Send to Gengo" - else: - msg = "This language is select as Active All Translation Request will be sent by System Automatically" - - except Exception, e: - msg = '%s' % e - context.update({'message': msg}) - obj_model = self.pool.get('ir.model.data') - model_data_ids = obj_model.search(cr, uid, [('model', '=', 'ir.ui.view'), ('name', '=', 'update_translation_wizard_view_confirm')]) - resource_id = obj_model.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id'] - return { - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'gengo.update.message', - 'views': [(resource_id, 'form')], - 'type': 'ir.actions.act_window', - 'target': 'new', - 'context': context, - } - - def scheduler_get_gengo_response(self, cr, uid, ids=0, context=None): + def _sync_response(self, cr, uid, ids=0, context=None): """Scheduler will be call to get response from gengo and all term will get - by scheduler which terms are in reviewable state""" + by scheduler which terms are in approved state""" meta = self.pool.get('jobs.meta') translation_pool = self.pool.get('ir.translation') gengo = meta.gengo_authentication(cr, uid, ids, context) - res = gengo.getTranslationJobs(status="approved") - if res: - response = meta.unpack_jobs_response(res) - for job in response.response: - job_response=gengo.getTranslationJob(id=job['job_id']) - jobs_response = meta.unpack_jobs_response(job_response) - translation_id = translation_pool.search(cr, uid, [('src', '=', jobs_response.response[0]['body_src'])], context) - translation_pool.write(cr, uid, translation_id, {'value': jobs_response.response[0]['body_tgt'], 'state': 'translated', 'gengo_control': True}) + translation_id = translation_pool.search(cr, uid, [('job_id', '!=', False), ('state', '=', 'inprogress'), ('gengo_translation', '=', True)], limit=local.LIMIT, context=context) + for trns in translation_pool.browse(cr, uid, translation_id, context): + job_response = gengo.getTranslationJob(id=trns.job_id) + if job_response['response']['job']['status'] == 'approved': + translation_pool.write(cr, uid, translation_id, {'value': job_response['response']['job']['body_tgt'], 'state': 'translated', 'gengo_control': True}) + return True - def scheduler_get_gengo_sync_request(self, cr, uid, ids=0, context=None): + def _sync_request(self, cr, uid, ids=0, context=None): """This scheduler will send a job request to the gengo , which terms are in translate state and gengo_translation is true""" - if context is None: context = {} try: language_pool = self.pool.get('res.lang') + trg_lang = self.browse(cr, uid, ids)[0] translation_pool = self.pool.get('ir.translation') - lang_search_id = language_pool.search(cr, uid, [('gengo_sync', '=', True)]) - lang_ids = language_pool.read(cr, uid, lang_search_id) - - for lang_id in lang_ids: - translation_term_id = translation_pool.search(cr, uid, [('state', '=', 'translate'), ('gengo_translation', '=', 'True'), ('lang', '=', lang_id['code'])]) - context.update({'lang': lang_id['code'], 'translation_term_id': translation_term_id}) - if translation_term_id: - self.send_translation_terms(cr, uid, ids, context) + lang_search_id = language_pool.search(cr, uid, [('gengo_sync', '=', True), ('code', '=', trg_lang.lang)]) + if not lang_search_id: + term_ids = translation_pool.search(cr, uid, [('state', '=', 'inprogress'), ('gengo_translation', '=', 'True'), ('lang', '=', trg_lang.lang)], limit=local.LIMIT) + self._send_translation_terms(cr, uid, ids, trg_lang.lang, term_ids, context) + msg = "Your Request has been Successfully Send to Gengo" + else: + msg = "This language is select as Active All Translation Request will be sent by System Automatically" + context.update({'message': msg}) except Exception, e: - _logger.warning('A Gengo Exception is occur:: %s', e) + _logger.warning("%s", e) _name = 'base.update.translations' _inherit = "base.update.translations" -gengo_update_translation() +base_update_translation() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_gengo/wizard/wrap_object.py b/addons/base_gengo/wizard/wrap_object.py index 01368e5e2cb..3ded7af12b1 100644 --- a/addons/base_gengo/wizard/wrap_object.py +++ b/addons/base_gengo/wizard/wrap_object.py @@ -24,7 +24,7 @@ from tools.translate import _ from mygengo import MyGengo import re -REQUEST_LIMIT = 10 +LIMIT = 20 LANG_MAPPING = { 'ar': 'Arabic', @@ -73,13 +73,6 @@ class gengo_response(object): """ """ def __init__(self, jobs): - response = jobs['response'] - job = [] - if isinstance(response, list): - job = [gengo_job(value) for value in response] - else: - job = [gengo_job(value) for value in response.values()] - jobs.update({'response': job}) self._data = jobs def __getitem__(self, name): @@ -123,37 +116,33 @@ class JobsMeta(orm.AbstractModel): public_key=gengo_parameter_pool.company_id.gengo_public_key.encode('ascii'), private_key=gengo_parameter_pool.company_id.gengo_private_key.encode('ascii'), sandbox=True, - ) + ) return gengo except Exception, e: raise osv.except_osv(_('Warning !'), _(e)) - def pack_jobs_request(self, cr, uid, translation_term_id, context): + def pack_jobs_request(self, cr, uid, term_ids, trg_lang, context): jobs = {} auto_approve = 0 gengo_parameter_pool = self.pool.get('res.users').browse(cr, uid, uid, context) translation_pool = self.pool.get('ir.translation') - - if gengo_parameter_pool.company_id.gengo_auto_approve == True: + if gengo_parameter_pool.company_id.gengo_auto_approve: auto_approve = 1 + g_lang = LANG_CODE_MAPPING.get(trg_lang) + if g_lang: + for terms in translation_pool.browse(cr, uid, term_ids, context): + #NOTE: Discard none string and only special char string + if re.search(r"[a-z A-Z]", terms.src) and terms.src: + job = {'type': 'text', + 'slug': 'single::English to' + LANG_MAPPING.get(g_lang), + 'tier': gengo_parameter_pool.company_id.gengo_tier, + 'body_src': terms.src, + 'lc_src': 'en', + 'lc_tgt': g_lang, + 'auto_approve': auto_approve, + 'comment': gengo_parameter_pool.company_id.gengo_comment, + } + jobs.update({terms.id: job}) + return {'jobs': jobs} - for key, value in LANG_CODE_MAPPING.items(): - if key == context['language_code']: - for terms in translation_pool.read(cr, uid, translation_term_id, context=None): - translation_pool.write(cr, uid, translation_term_id, {'state': 'inprogress'}) - if re.search(r"[a-z A-Z]", terms['src']): - job = {'type': 'text', - 'slug': 'single::English to' + LANG_MAPPING.get(value), - 'tier': gengo_parameter_pool.company_id.gengo_tier, - 'body_src': terms['src'], - 'lc_src': 'en', - 'lc_tgt': value, - 'auto_approve': auto_approve, - 'comment': gengo_parameter_pool.company_id.gengo_comment, - } - jobs.update({terms['id']: job}) - return {'jobs': jobs} - - def unpack_jobs_response(self, jobs): - return gengo_response(jobs) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From fedd324e6d6cc774bbcc315096a6388b2e0eb2f7 Mon Sep 17 00:00:00 2001 From: "ajay javiya (OpenERP)" Date: Fri, 24 Aug 2012 18:51:25 +0530 Subject: [PATCH 10/10] [IMP]: Improve send and receive queue bzr revid: aja@tinyerp.com-20120824132125-a74lw82hm77al1zh --- .../wizard/gengo_update_translation.py | 121 ++++++++++++------ addons/base_gengo/wizard/wrap_object.py | 73 +++++++---- 2 files changed, 125 insertions(+), 69 deletions(-) diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index d54358c32d9..61bf9b5ed7d 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -25,17 +25,18 @@ import logging _logger = logging.getLogger(__name__) cron_vals = { -'name': 'Gengo Sync', -'active': True, -'interval_number': 30, -'interval_type': 'minutes', -'numbercall': -1, -'model': "'base.update.translations'", -'function': "" + 'name': 'Gengo Sync', + 'active': True, + 'interval_number': 30, + 'interval_type': 'minutes', + 'numbercall': -1, + 'model': "'base.update.translations'", + 'function': "" } class base_update_translation(osv.osv_memory): + def _update_terms(self, cr, uid, ids, response, tier, context): translation_pool = self.pool.get('ir.translation') for jobs in response['jobs']: @@ -48,25 +49,30 @@ class base_update_translation(osv.osv_memory): translation_pool.write(cr, uid, [t_id], vals, context) return - - def _send_translation_terms(self, cr, uid, ids, trg_lang, term_ids, context): + def _send_translation_terms(self, cr, uid, ids, term_ids, context): """ Lazy Polling will be perform when user or cron request for the trnalstion. """ meta = self.pool.get('jobs.meta') user = self.pool.get('res.users').browse(cr, uid, uid, context) - gengo = meta.gengo_authentication(cr, uid, ids, context) - request = meta.pack_jobs_request(cr, uid, term_ids, trg_lang, context) - result = gengo.postTranslationJobs(jobs=request) - if result['opstat'] == 'ok': - self._update_terms(cr, uid, ids, result['response'], user.company_id.gengo_tier, context) + flag, gengo = meta.gengo_authentication(cr, uid, context) + if flag: + + request = meta.pack_jobs_request(cr, uid, term_ids, context) + if request: + result = gengo.postTranslationJobs(jobs=request) + if result['opstat'] == 'ok': + self._update_terms(cr, uid, ids, result['response'], user.company_id.gengo_tier, context) + else: + _logger.error(gengo) return True def do_check_schedular(self, cr, uid, xml_id, name, fn, context=None): cron_pool = self.pool.get('ir.cron') try: - res = self.pool.get('ir.model.data')._get_id(cr, uid, 'base_gengo', xml_id) - cron_pool.write(cr, uid, [res], {'active': True}, context) + res = [] + model, res = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base_gengo', xml_id) + cron_pool.write(cr, uid, [res], {'active': True}, context=context) except: cron_vals.update({'name': name, "function": fn}) return cron_pool.create(cr, uid, cron_vals, context) @@ -75,46 +81,77 @@ class base_update_translation(osv.osv_memory): if context == None: context = {} lang_pool = self.pool.get('res.lang') - for res in self.browse(cr, uid, ids, context): - lang_id = lang_pool.search(cr, uid, [('code', '=', res.lang)]) - lang_pool.write(cr, uid, lang_id, {'gengo_sync': True}) - res = super(base_update_translation, self).act_update(cr, uid, ids, context) - self.do_check_schedular(cr, uid, 'gengo_sync_send_request_scheduler', 'gengo_sync_send_request_scheduler', '_sync_request', context) - self.do_check_schedular(cr, uid, 'gengo_sync_receive_request_scheduler', 'gengo_sync_send_request_scheduler', '_sync_response', context) - return {} + super(base_update_translation, self).act_update(cr, uid, ids, context) + msg = "1. Translation file loaded succesfully.\n2. Processing Gengo Translation:\n" + meta = self.pool.get('jobs.meta') + flag, gengo = meta.gengo_authentication(cr, uid, context) + if not flag: + msg += gengo + else: + for res in self.browse(cr, uid, ids, context): + lang_id = lang_pool.search(cr, uid, [('code', '=', res.lang)]) + lang_search = lang_pool.search(cr, uid, [('gengo_sync', '=', True), + ('id', '=', lang_id[0])]) + if lang_search: + msg += 'This language %s is alreay in queue for processing.' % (res.lang) + else: + msg += "Translation for language %s is queued for processing." % (res.lang) + lang_pool.write(cr, uid, lang_id, {'gengo_sync': True}) + _logger.info("Your translation request for language '%s' has been send sucessfully.", res.lang) - def _sync_response(self, cr, uid, ids=0, context=None): + self.do_check_schedular(cr, uid, 'gengo_sync_send_request_scheduler', 'Gengo Sync Translation (Request)', '_sync_request', context) + self.do_check_schedular(cr, uid, 'gengo_sync_receive_request_scheduler', 'Gengo Sync Translation (Response)', '_sync_response', context) + self._sync_request(cr, uid, ids, context) + context.update({'message': msg}) + obj_model = self.pool.get('ir.model.data') + model_data_ids = obj_model.search(cr, uid, [('model', '=', 'ir.ui.view'), ('name', '=', 'update_translation_wizard_view_confirm')]) + view_id = obj_model.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id'] + return { + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'gengo.update.message', + 'views': [(view_id, 'form')], + 'type': 'ir.actions.act_window', + 'target': 'new', + 'context': context, + } + + def _sync_response(self, cr, uid, ids=False, context=None): """Scheduler will be call to get response from gengo and all term will get by scheduler which terms are in approved state""" meta = self.pool.get('jobs.meta') translation_pool = self.pool.get('ir.translation') - gengo = meta.gengo_authentication(cr, uid, ids, context) - translation_id = translation_pool.search(cr, uid, [('job_id', '!=', False), ('state', '=', 'inprogress'), ('gengo_translation', '=', True)], limit=local.LIMIT, context=context) - for trns in translation_pool.browse(cr, uid, translation_id, context): - job_response = gengo.getTranslationJob(id=trns.job_id) - if job_response['response']['job']['status'] == 'approved': - translation_pool.write(cr, uid, translation_id, {'value': job_response['response']['job']['body_tgt'], 'state': 'translated', 'gengo_control': True}) + flag, gengo = meta.gengo_authentication(cr, uid, context) + if not flag: + _logger.warning("%s", gengo) + else: + translation_id = translation_pool.search(cr, uid, [('state', '=', 'inprogress'), ('gengo_translation', '=', True)], limit=local.LIMIT, context=context) + for trns in translation_pool.browse(cr, uid, translation_id, context): + if trns.job_id: + job_response = gengo.getTranslationJob(id=trns.job_id) + if job_response['response']['job']['status'] == 'approved': + translation_pool.write(cr, uid, trns.id, {'value': job_response['response']['job']['body_tgt'], 'state': 'translated', 'gengo_control': True}) return True - def _sync_request(self, cr, uid, ids=0, context=None): + def _sync_request(self, cr, uid, ids=False, context=None): """This scheduler will send a job request to the gengo , which terms are in translate state and gengo_translation is true""" if context is None: context = {} + language_pool = self.pool.get('res.lang') + translation_pool = self.pool.get('ir.translation') try: - language_pool = self.pool.get('res.lang') - trg_lang = self.browse(cr, uid, ids)[0] - translation_pool = self.pool.get('ir.translation') - lang_search_id = language_pool.search(cr, uid, [('gengo_sync', '=', True), ('code', '=', trg_lang.lang)]) - if not lang_search_id: - term_ids = translation_pool.search(cr, uid, [('state', '=', 'inprogress'), ('gengo_translation', '=', 'True'), ('lang', '=', trg_lang.lang)], limit=local.LIMIT) - self._send_translation_terms(cr, uid, ids, trg_lang.lang, term_ids, context) - msg = "Your Request has been Successfully Send to Gengo" + lang_ids = language_pool.search(cr, uid, [('gengo_sync', '=', True)]) + langs = [lang.code for lang in language_pool.browse(cr, uid, lang_ids)] + langs = self.pool.get('jobs.meta').check_lang_support(cr, uid, langs) + term_ids = translation_pool.search(cr, uid, [('state', '=', 'translate'), ('gengo_translation', '=', True), ('lang', 'in', langs)], limit=local.LIMIT) + if term_ids: + self._send_translation_terms(cr, uid, ids, term_ids, context) + _logger.info("Translation terms %s has been posted to gengo successfully", len(term_ids)) else: - msg = "This language is select as Active All Translation Request will be sent by System Automatically" - context.update({'message': msg}) + _logger.info('No Translation terms to process.') except Exception, e: - _logger.warning("%s", e) + _logger.error("%s", e) _name = 'base.update.translations' _inherit = "base.update.translations" diff --git a/addons/base_gengo/wizard/wrap_object.py b/addons/base_gengo/wizard/wrap_object.py index 3ded7af12b1..2679d080d9d 100644 --- a/addons/base_gengo/wizard/wrap_object.py +++ b/addons/base_gengo/wizard/wrap_object.py @@ -19,10 +19,9 @@ # ############################################################################## -from osv import orm, osv -from tools.translate import _ +from osv import orm +import tools from mygengo import MyGengo -import re LIMIT = 20 @@ -57,12 +56,13 @@ LANG_CODE_MAPPING = { 'sv_SE': 'sv', 'ko_KR': 'ko', 'pt_PT': 'pt', - 'en': 'en', + 'en_US': 'en', 'ja_JP': 'ja', 'es_ES': 'es', 'zh_CN': 'zh', 'de_DE': 'de', 'fr_FR': 'fr', + 'fr_BE': 'fr', 'ru_RU': 'ru', 'it_IT': 'it', 'pt_BR': 'pt-br' @@ -105,44 +105,63 @@ class JobsMeta(orm.AbstractModel): _name = "jobs.meta" - def gengo_authentication(self, cr, uid, ids, context=None): + def gengo_authentication(self, cr, uid, context=None): ''' To Send Request and Get Response from Gengo User needs Public and Private key for that user need to signup to gengo and get public and private key which is provided by gengo to authentic user ''' - gengo_parameter_pool = self.pool.get('res.users').browse(cr, uid, uid, context) + user = self.pool.get('res.users').browse(cr, uid, uid, context) + if not user.company_id.gengo_public_key or not user.company_id.gengo_private_key: + return (False, "Invalid gengo configuration.\nEither pulic key or private key is missing.") try: gengo = MyGengo( - public_key=gengo_parameter_pool.company_id.gengo_public_key.encode('ascii'), - private_key=gengo_parameter_pool.company_id.gengo_private_key.encode('ascii'), + public_key=user.company_id.gengo_public_key.encode('ascii'), + private_key=user.company_id.gengo_private_key.encode('ascii'), sandbox=True, - ) - return gengo + ) + gengo.getAccountStats() + return (True, gengo) except Exception, e: - raise osv.except_osv(_('Warning !'), _(e)) + return (False, "Gengo Connection Error\n"+e.message) - def pack_jobs_request(self, cr, uid, term_ids, trg_lang, context): + def pack_jobs_request(self, cr, uid, term_ids, context): jobs = {} auto_approve = 0 gengo_parameter_pool = self.pool.get('res.users').browse(cr, uid, uid, context) translation_pool = self.pool.get('ir.translation') if gengo_parameter_pool.company_id.gengo_auto_approve: auto_approve = 1 - g_lang = LANG_CODE_MAPPING.get(trg_lang) - if g_lang: - for terms in translation_pool.browse(cr, uid, term_ids, context): - #NOTE: Discard none string and only special char string - if re.search(r"[a-z A-Z]", terms.src) and terms.src: - job = {'type': 'text', - 'slug': 'single::English to' + LANG_MAPPING.get(g_lang), - 'tier': gengo_parameter_pool.company_id.gengo_tier, - 'body_src': terms.src, - 'lc_src': 'en', - 'lc_tgt': g_lang, - 'auto_approve': auto_approve, - 'comment': gengo_parameter_pool.company_id.gengo_comment, - } - jobs.update({terms.id: job}) + for term in translation_pool.browse(cr, uid, term_ids, context): + if term.src and term.src != "": + job = {'type': 'text', + 'slug': 'single::English to' + LANG_CODE_MAPPING[term.lang], + 'tier': tools.ustr(gengo_parameter_pool.company_id.gengo_tier), + 'body_src': term.src, + 'lc_src': 'en', + 'lc_tgt': LANG_CODE_MAPPING[term.lang], + 'auto_approve': auto_approve, + 'comment': gengo_parameter_pool.company_id.gengo_comment, + } + jobs.update({term.id: job}) return {'jobs': jobs} + def check_lang_support(self, cr, uid, langs, context=None): + new_langs = [] + flag, gengo = self.gengo_authentication(cr, uid, context) + if not flag: + return [] + else: + user = self.pool.get('res.users').browse(cr, uid, uid, context) + tier = user.company_id.gengo_tier + if tier == "machine": + tier = "nonprofit" + + lang_pair = gengo.getServiceLanguagePairs(lc_src='en') + if lang_pair['opstat'] == 'ok': + for g_lang in lang_pair['response']: + for l in langs: + if LANG_CODE_MAPPING[l] == g_lang['lc_tgt'] and g_lang['tier'] == tier: + new_langs.append(l) + return list(set(new_langs)) +JobsMeta() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: