From 65e6027d63700c49dd49c60d62b41b55849f96e8 Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Wed, 11 Jul 2012 11:00:16 +0530 Subject: [PATCH 01/40] [ADD] module base gengo bzr revid: jam@tinyerp.com-20120711053016-7i20l7l94f56sn9t --- addons/base_gengo/__init__.py | 22 ++++++++++++++++++ addons/base_gengo/__openerp__.py | 40 ++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 addons/base_gengo/__init__.py create mode 100644 addons/base_gengo/__openerp__.py diff --git a/addons/base_gengo/__init__.py b/addons/base_gengo/__init__.py new file mode 100644 index 00000000000..6825dc22f47 --- /dev/null +++ b/addons/base_gengo/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Openerp sa (). +# +# 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 . +# +############################################################################## + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_gengo/__openerp__.py b/addons/base_gengo/__openerp__.py new file mode 100644 index 00000000000..43a6e258418 --- /dev/null +++ b/addons/base_gengo/__openerp__.py @@ -0,0 +1,40 @@ +# -*- 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 . +# +############################################################################## + +{ + 'name': 'Automated Translations through Gengo API', + 'version': '0.1', + 'category': 'Tools', + 'description': """ +Automated Translations through Gengo API + """, + 'author': 'OpenERP SA', + 'website': 'http://www.openerp.com', + 'depends': ['base'], + 'init_xml': [], + 'update_xml': [], + 'demo_xml': [], + 'test': [], + 'installable': True, + 'auto_install': False, +} + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From 9eda964e6e165f35a77242cba0e57c3e73187b6a Mon Sep 17 00:00:00 2001 From: "Twinkle Christian (OpenERP)" Date: Fri, 13 Jul 2012 17:41:29 +0530 Subject: [PATCH 02/40] [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 03/40] [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 04/40] [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 05/40] [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 06/40] [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 07/40] [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 08/40] [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 09/40] [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 10/40] [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 11/40] [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: From a1d8ce709f3b1806abe83631afe18c7c158a0be9 Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Fri, 24 Aug 2012 19:01:15 +0530 Subject: [PATCH 12/40] [ADD] Added new wrapper file and security dir bzr revid: jam@tinyerp.com-20120824133115-70143pldvvmk2v8y --- addons/base_gengo/wizard/abstract_wrapper.py | 167 +++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 addons/base_gengo/wizard/abstract_wrapper.py diff --git a/addons/base_gengo/wizard/abstract_wrapper.py b/addons/base_gengo/wizard/abstract_wrapper.py new file mode 100644 index 00000000000..2679d080d9d --- /dev/null +++ b/addons/base_gengo/wizard/abstract_wrapper.py @@ -0,0 +1,167 @@ +# -*- 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 +import tools +from mygengo import MyGengo + +LIMIT = 20 + +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_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' +} + + +class gengo_response(object): + """ + """ + def __init__(self, jobs): + 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, 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 ''' + + 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=user.company_id.gengo_public_key.encode('ascii'), + private_key=user.company_id.gengo_private_key.encode('ascii'), + sandbox=True, + ) + gengo.getAccountStats() + return (True, gengo) + except Exception, e: + return (False, "Gengo Connection Error\n"+e.message) + + 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 + 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: From ac0566a8564e75aa23c99e0de5227a427c8d1fb5 Mon Sep 17 00:00:00 2001 From: "ajay javiya (OpenERP)" Date: Mon, 27 Aug 2012 12:22:18 +0530 Subject: [PATCH 13/40] [FIX] base_gengo: remove warning bzr revid: aja@tinyerp.com-20120827065218-3ztowz1icyc6jv82 --- addons/base_gengo/wizard/__init__.py | 1 - addons/base_gengo/wizard/abstract_wrapper.py | 167 ------------------ .../base_gengo/wizard/gengo_update_message.py | 2 +- .../wizard/gengo_update_translation.py | 126 +++++++++++-- 4 files changed, 116 insertions(+), 180 deletions(-) delete mode 100644 addons/base_gengo/wizard/abstract_wrapper.py diff --git a/addons/base_gengo/wizard/__init__.py b/addons/base_gengo/wizard/__init__.py index 7bde4753da6..3e6c687d9de 100644 --- a/addons/base_gengo/wizard/__init__.py +++ b/addons/base_gengo/wizard/__init__.py @@ -20,6 +20,5 @@ ############################################################################## import gengo_update_translation -import abstract_wrapper import gengo_update_message # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_gengo/wizard/abstract_wrapper.py b/addons/base_gengo/wizard/abstract_wrapper.py deleted file mode 100644 index 2679d080d9d..00000000000 --- a/addons/base_gengo/wizard/abstract_wrapper.py +++ /dev/null @@ -1,167 +0,0 @@ -# -*- 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 -import tools -from mygengo import MyGengo - -LIMIT = 20 - -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_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' -} - - -class gengo_response(object): - """ - """ - def __init__(self, jobs): - 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, 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 ''' - - 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=user.company_id.gengo_public_key.encode('ascii'), - private_key=user.company_id.gengo_private_key.encode('ascii'), - sandbox=True, - ) - gengo.getAccountStats() - return (True, gengo) - except Exception, e: - return (False, "Gengo Connection Error\n"+e.message) - - 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 - 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: diff --git a/addons/base_gengo/wizard/gengo_update_message.py b/addons/base_gengo/wizard/gengo_update_message.py index 214b9978a19..88fb0283825 100644 --- a/addons/base_gengo/wizard/gengo_update_message.py +++ b/addons/base_gengo/wizard/gengo_update_message.py @@ -23,7 +23,7 @@ from osv import osv from osv import fields -class gengo_update_message(osv.osv): +class gengo_update_message(osv.osv_memory): """Update Message""" _name = "gengo.update.message" diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index 9cb5f0696f5..a6db51f870d 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -20,9 +20,58 @@ ############################################################################## from osv import osv -import abstract_wrapper as local import logging +import tools _logger = logging.getLogger(__name__) +try: + from mygengo import MyGengo +except ImportError: + raise osv.except_osv(_('Gengo ImportError'),_('Please install mygengo lib from http://pypi.python.org/pypi/mygengo')) + +LIMIT = 20 + +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_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' +} cron_vals = { 'name': 'Gengo Sync', @@ -37,6 +86,64 @@ cron_vals = { class base_update_translation(osv.osv_memory): + 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 ''' + + 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=user.company_id.gengo_public_key.encode('ascii'), + private_key=user.company_id.gengo_private_key.encode('ascii'), + sandbox=True, + ) + gengo.getAccountStats() + return (True, gengo) + except Exception, e: + return (False, "Gengo Connection Error\n"+e.message) + + 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 + 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)) def _update_terms(self, cr, uid, ids, response, tier, context): translation_pool = self.pool.get('ir.translation') for jobs in response['jobs']: @@ -53,12 +160,11 @@ class base_update_translation(osv.osv_memory): """ 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) - flag, gengo = meta.gengo_authentication(cr, uid, context) + flag, gengo = self.gengo_authentication(cr, uid, context) if flag: - request = meta.pack_jobs_request(cr, uid, term_ids, context) + request = self.pack_jobs_request(cr, uid, term_ids, context) if request: result = gengo.postTranslationJobs(jobs=request) if result['opstat'] == 'ok': @@ -83,8 +189,7 @@ class base_update_translation(osv.osv_memory): lang_pool = self.pool.get('res.lang') 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) + flag, gengo = self.gengo_authentication(cr, uid, context) if not flag: msg += gengo else: @@ -119,13 +224,12 @@ class base_update_translation(osv.osv_memory): 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') - flag, gengo = meta.gengo_authentication(cr, uid, context) + flag, gengo = self.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) + translation_id = translation_pool.search(cr, uid, [('state', '=', 'inprogress'), ('gengo_translation', '=', True)], limit=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) @@ -143,8 +247,8 @@ class base_update_translation(osv.osv_memory): try: 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) + langs = self.check_lang_support(cr, uid, langs) + term_ids = translation_pool.search(cr, uid, [('state', '=', 'translate'), ('gengo_translation', '=', True), ('lang', 'in', langs)], limit=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)) From 6ad7a5a4b0cb8d8c23d45d0b4ed3fdb40888df70 Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Mon, 27 Aug 2012 12:57:43 +0530 Subject: [PATCH 14/40] [FIX/USA] Usabality Impovments ans Import error fixed bzr revid: jam@tinyerp.com-20120827072743-v022e5obnd06csoy --- addons/base_gengo/res_company.py | 2 +- addons/base_gengo/res_company_view.xml | 8 ++++---- addons/base_gengo/wizard/gengo_update_translation.py | 2 ++ 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/addons/base_gengo/res_company.py b/addons/base_gengo/res_company.py index 888e675e26b..8e26f406f30 100644 --- a/addons/base_gengo/res_company.py +++ b/addons/base_gengo/res_company.py @@ -33,7 +33,7 @@ class res_company(osv.Model): ('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."), + "gengo_auto_approve": fields.boolean("Auto Approve Translation ?", help="Jobs are Automatically Approved by Gengo."), "fields_ids": fields.many2many('ir.model.fields', 'fields_company_rel', 'field_id', 'model_id', 'fields'), } diff --git a/addons/base_gengo/res_company_view.xml b/addons/base_gengo/res_company_view.xml index bfa0b1ddf95..f51ee4d4f95 100644 --- a/addons/base_gengo/res_company_view.xml +++ b/addons/base_gengo/res_company_view.xml @@ -11,11 +11,11 @@ - - - - + + + + diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index a6db51f870d..33e90384275 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -22,6 +22,8 @@ from osv import osv import logging import tools +from tools.translate import _ + _logger = logging.getLogger(__name__) try: from mygengo import MyGengo From 0072333206e790f5031f207b3cfcfd99b58b5fde Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Mon, 27 Aug 2012 15:10:27 +0530 Subject: [PATCH 15/40] [FIX]Import error fixed bzr revid: jam@tinyerp.com-20120827094027-jgmwf8wrb76epj8q --- addons/base_gengo/wizard/gengo_update_translation.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index 33e90384275..e2734f04cbe 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -20,15 +20,17 @@ ############################################################################## from osv import osv +try: + from mygengo import MyGeng +except ImportError: + raise osv.except_osv(_('Gengo ImportError'), _('Please install mygengo lib from http://pypi.python.org/pypi/mygengo')) + import logging import tools from tools.translate import _ _logger = logging.getLogger(__name__) -try: - from mygengo import MyGengo -except ImportError: - raise osv.except_osv(_('Gengo ImportError'),_('Please install mygengo lib from http://pypi.python.org/pypi/mygengo')) + LIMIT = 20 From d1595a063545ca1aed0b2cb73265e7a55c9d4a9c Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Mon, 27 Aug 2012 15:11:37 +0530 Subject: [PATCH 16/40] [FIX]_ error fixed bzr revid: jam@tinyerp.com-20120827094137-vw9ztsn1vv31egy4 --- addons/base_gengo/wizard/gengo_update_translation.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index e2734f04cbe..9ac023bdbbd 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -20,8 +20,9 @@ ############################################################################## from osv import osv +from tools.translate import _ try: - from mygengo import MyGeng + from mygengo import MyGengo except ImportError: raise osv.except_osv(_('Gengo ImportError'), _('Please install mygengo lib from http://pypi.python.org/pypi/mygengo')) From e112222207c33c093686fc91d709905121ebdbe0 Mon Sep 17 00:00:00 2001 From: "ajay javiya (OpenERP)" Date: Mon, 27 Aug 2012 16:24:13 +0530 Subject: [PATCH 17/40] [ADD]base_gengo:Get comment from gengo and add to openerp bzr revid: aja@tinyerp.com-20120827105413-usu1a5wqxjx8j71s --- .../wizard/gengo_update_translation.py | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index 33e90384275..fe2460d55e0 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -22,6 +22,7 @@ from osv import osv import logging import tools +import time from tools.translate import _ _logger = logging.getLogger(__name__) @@ -88,6 +89,9 @@ cron_vals = { class base_update_translation(osv.osv_memory): + _name = 'base.update.translations' + _inherit = "base.update.translations" + 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 @@ -224,19 +228,36 @@ class base_update_translation(osv.osv_memory): } 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""" + """ + This method will be call by cron services to get translation from + gengo for translation terms which are posted to be translated. It will + read translated terms and comments from gengo and will update respective + translation in openerp """ translation_pool = self.pool.get('ir.translation') flag, gengo = self.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=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) + for term in translation_pool.browse(cr, uid, translation_id, context): + if term.job_id: + vals={} + job_response = gengo.getTranslationJob(id=term.job_id) + if job_response['opstat'] != 'ok': + _logger.warning("Invalid Response Skeeping translation Terms for 'id' %s."%(term.job_id)) + continue 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}) + vals.update({'state': 'translated', + 'value': job_response['response']['job']['body_tgt'], + 'gengo_control': True}) + 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 by %s at %s. \n' %(comment['body'],comment['author'],time.ctime(comment['ctime'])) + vals.update({'gengo_comment':gengo_comments}) + if vals: + translation_pool.write(cr, uid, term.id,vals) return True def _sync_request(self, cr, uid, ids=False, context=None): @@ -259,8 +280,4 @@ class base_update_translation(osv.osv_memory): except Exception, e: _logger.error("%s", e) - _name = 'base.update.translations' - _inherit = "base.update.translations" - -base_update_translation() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From cd52658a64b4dc63a5b2369ca435f7ee9be4d877 Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Mon, 27 Aug 2012 16:36:40 +0530 Subject: [PATCH 18/40] [FIX] removed the view type field bzr revid: jam@tinyerp.com-20120827110640-cjtmztups89c8exs --- addons/base_gengo/ir_translation.xml | 2 -- addons/base_gengo/res_company_view.xml | 1 - addons/base_gengo/res_lang_view.xml | 1 - addons/base_gengo/wizard/alert_message_gengo.xml | 1 - 4 files changed, 5 deletions(-) diff --git a/addons/base_gengo/ir_translation.xml b/addons/base_gengo/ir_translation.xml index 753c12c7e7d..30108c882b5 100644 --- a/addons/base_gengo/ir_translation.xml +++ b/addons/base_gengo/ir_translation.xml @@ -5,7 +5,6 @@ Translations ir.translation - search @@ -19,7 +18,6 @@ ir.translation.form.inherit ir.translation - form diff --git a/addons/base_gengo/res_company_view.xml b/addons/base_gengo/res_company_view.xml index f51ee4d4f95..3606fbf58da 100644 --- a/addons/base_gengo/res_company_view.xml +++ b/addons/base_gengo/res_company_view.xml @@ -6,7 +6,6 @@ res.company.form.inherit res.company - form diff --git a/addons/base_gengo/res_lang_view.xml b/addons/base_gengo/res_lang_view.xml index e0c8edd11aa..38e6b995163 100644 --- a/addons/base_gengo/res_lang_view.xml +++ b/addons/base_gengo/res_lang_view.xml @@ -6,7 +6,6 @@ res.lang.form.inherit res.lang - form diff --git a/addons/base_gengo/wizard/alert_message_gengo.xml b/addons/base_gengo/wizard/alert_message_gengo.xml index 84bfc7bb484..c2121b8ce6d 100644 --- a/addons/base_gengo/wizard/alert_message_gengo.xml +++ b/addons/base_gengo/wizard/alert_message_gengo.xml @@ -5,7 +5,6 @@ gengo.update.message.form gengo.update.message - form
From 72a2c0f0aba16ccfabfe6647b16f7043af561abb Mon Sep 17 00:00:00 2001 From: "ajay javiya (OpenERP)" Date: Mon, 27 Aug 2012 19:07:59 +0530 Subject: [PATCH 19/40] [IMP]: Improve lang_code_mapping bzr revid: aja@tinyerp.com-20120827133759-resjxxg7w772ntj7 --- addons/base_gengo/__init__.py | 1 + .../base_gengo/gengo_sync_schedular_data.xml | 2 +- addons/base_gengo/ir_translation.py | 2 +- addons/base_gengo/res_company.py | 2 +- addons/base_gengo/res_company_view.xml | 3 - addons/base_gengo/wizard/__init__.py | 1 + .../wizard/gengo_update_translation.py | 108 +++++++----------- 7 files changed, 49 insertions(+), 70 deletions(-) diff --git a/addons/base_gengo/__init__.py b/addons/base_gengo/__init__.py index c434c6b1843..b4fd54acd21 100644 --- a/addons/base_gengo/__init__.py +++ b/addons/base_gengo/__init__.py @@ -23,4 +23,5 @@ 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/gengo_sync_schedular_data.xml b/addons/base_gengo/gengo_sync_schedular_data.xml index ab78b59e0b8..2a12626713c 100644 --- a/addons/base_gengo/gengo_sync_schedular_data.xml +++ b/addons/base_gengo/gengo_sync_schedular_data.xml @@ -12,7 +12,7 @@ - + Gengo Sync Translation (Request) diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index 7bda5023592..297e449ecdc 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -29,7 +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), + 'job_id': fields.char('Gengo Job Id', size=32), } _defaults = { diff --git a/addons/base_gengo/res_company.py b/addons/base_gengo/res_company.py index 8e26f406f30..9062095bb87 100644 --- a/addons/base_gengo/res_company.py +++ b/addons/base_gengo/res_company.py @@ -34,9 +34,9 @@ class res_company(osv.Model): ('ultra', 'Ultra')], "Tier types", required=True), "gengo_comment": fields.text("comments"), "gengo_auto_approve": fields.boolean("Auto Approve Translation ?", 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", + "gengo_auto_approve": True, } diff --git a/addons/base_gengo/res_company_view.xml b/addons/base_gengo/res_company_view.xml index 3606fbf58da..60cd767b140 100644 --- a/addons/base_gengo/res_company_view.xml +++ b/addons/base_gengo/res_company_view.xml @@ -24,9 +24,6 @@ - - - diff --git a/addons/base_gengo/wizard/__init__.py b/addons/base_gengo/wizard/__init__.py index 3e6c687d9de..f661b3b8114 100644 --- a/addons/base_gengo/wizard/__init__.py +++ b/addons/base_gengo/wizard/__init__.py @@ -21,4 +21,5 @@ import gengo_update_translation import 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 9ac023bdbbd..e3a147f9306 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -21,6 +21,7 @@ from osv import osv from tools.translate import _ +import re try: from mygengo import MyGengo except ImportError: @@ -28,54 +29,30 @@ except ImportError: import logging import tools -from tools.translate import _ - _logger = logging.getLogger(__name__) - LIMIT = 20 -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_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' + 'ar_SA': ('ar', 'Arabic'), + 'id_ID': ('id', 'Indonesian'), + 'nl_NL': ('nl', 'Dutch'), + 'fr_CA': ('fr-ca', 'French (Canada)'), + 'pl': ('Polish'), + 'zh_TW': ('zh-tw', 'Chinese (Traditional)'), + 'sv_SE': ('sv', 'Swedish'), + 'ko_KR': ('ko', 'Korean'), + 'pt_PT': ('pt', 'Portuguese (Europe)'), + 'en_US': ('en', 'English'), + 'ja_JP': ('ja', 'Japanese'), + 'es_ES': ('es', 'Spanish (Spain)'), + 'zh_CN': ('zh', 'Chinese (Simplified)'), + 'de_DE': ('de', 'German'), + 'fr_FR': ('fr', 'French'), + 'fr_BE': ('fr', 'French'), + 'ru_RU': ('ru', 'Russian'), + 'it_IT': ('it', 'Italian'), + 'pt_BR': ('pt-br', 'Portuguese (Brazil)') } cron_vals = { @@ -93,12 +70,12 @@ class base_update_translation(osv.osv_memory): 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 for that user need to sign up to gengo and get public and private key which is provided by gengo to authentic user ''' 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.") + return (False, "Invalid gengo configuration.\n Either public key or private key is missing.") try: gengo = MyGengo( public_key=user.company_id.gengo_public_key.encode('ascii'), @@ -108,7 +85,7 @@ class base_update_translation(osv.osv_memory): gengo.getAccountStats() return (True, gengo) except Exception, e: - return (False, "Gengo Connection Error\n"+e.message) + return (False, "Gengo Connection Error\n" + e.message) def pack_jobs_request(self, cr, uid, term_ids, context): jobs = {} @@ -118,17 +95,18 @@ class base_update_translation(osv.osv_memory): if gengo_parameter_pool.company_id.gengo_auto_approve: auto_approve = 1 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}) + if term.src: + if re.search(r"\w",term.src): + job = {'type': 'text', + 'slug': 'single::English to ' + LANG_CODE_MAPPING[term.lang][1], + 'tier': tools.ustr(gengo_parameter_pool.company_id.gengo_tier), + 'body_src': term.src, + 'lc_src': 'en', + 'lc_tgt': LANG_CODE_MAPPING[term.lang][0], + '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): @@ -146,9 +124,10 @@ class base_update_translation(osv.osv_memory): 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: + if LANG_CODE_MAPPING[l][0] == g_lang['lc_tgt'] and g_lang['tier'] == tier: new_langs.append(l) return list(set(new_langs)) + def _update_terms(self, cr, uid, ids, response, tier, context): translation_pool = self.pool.get('ir.translation') for jobs in response['jobs']: @@ -163,17 +142,18 @@ class base_update_translation(osv.osv_memory): def _send_translation_terms(self, cr, uid, ids, term_ids, context): """ - Lazy Polling will be perform when user or cron request for the trnalstion. + Lazy Polling will be perform when user or cron request for the translation. """ user = self.pool.get('res.users').browse(cr, uid, uid, context) flag, gengo = self.gengo_authentication(cr, uid, context) if flag: - request = self.pack_jobs_request(cr, uid, term_ids, context) - if request: + if request['jobs']: 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.info('') else: _logger.error(gengo) return True @@ -193,7 +173,7 @@ class base_update_translation(osv.osv_memory): context = {} lang_pool = self.pool.get('res.lang') super(base_update_translation, self).act_update(cr, uid, ids, context) - msg = "1. Translation file loaded succesfully.\n2. Processing Gengo Translation:\n" + msg = "1. Translation file loaded successfully.\n2. Processing Gengo Translation:\n" flag, gengo = self.gengo_authentication(cr, uid, context) if not flag: msg += gengo @@ -203,11 +183,11 @@ class base_update_translation(osv.osv_memory): 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) + msg += 'This language %s is already 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) + _logger.info("Your translation request for language '%s' has been send successfully.", res.lang) 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) From b8f2de2f97899385ee633615a182e17e1b883903 Mon Sep 17 00:00:00 2001 From: "ajay javiya (OpenERP)" Date: Tue, 28 Aug 2012 14:10:36 +0530 Subject: [PATCH 20/40] [IMP]:clean code in gengo_update_translation bzr revid: aja@tinyerp.com-20120828084036-9kxv2axis35vb8sv --- .../wizard/gengo_update_translation.py | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index e3a147f9306..0b9ccd05658 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -38,7 +38,7 @@ LANG_CODE_MAPPING = { 'id_ID': ('id', 'Indonesian'), 'nl_NL': ('nl', 'Dutch'), 'fr_CA': ('fr-ca', 'French (Canada)'), - 'pl': ('Polish'), + 'pl_PL': ('pl', 'Polish'), 'zh_TW': ('zh-tw', 'Chinese (Traditional)'), 'sv_SE': ('sv', 'Swedish'), 'ko_KR': ('ko', 'Korean'), @@ -55,7 +55,7 @@ LANG_CODE_MAPPING = { 'pt_BR': ('pt-br', 'Portuguese (Brazil)') } -cron_vals = { +CRON_VALS = { 'name': 'Gengo Sync', 'active': True, 'interval_number': 30, @@ -75,7 +75,7 @@ class base_update_translation(osv.osv_memory): 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.\n Either public key or private key is missing.") + return (False, "Invalid gengo configuration.\nEither public key or private key is missing.") try: gengo = MyGengo( public_key=user.company_id.gengo_public_key.encode('ascii'), @@ -85,7 +85,7 @@ class base_update_translation(osv.osv_memory): gengo.getAccountStats() return (True, gengo) except Exception, e: - return (False, "Gengo Connection Error\n" + e.message) + return (False, "Gengo Connection Error\n%s"%e) def pack_jobs_request(self, cr, uid, term_ids, context): jobs = {} @@ -96,7 +96,7 @@ class base_update_translation(osv.osv_memory): auto_approve = 1 for term in translation_pool.browse(cr, uid, term_ids, context): if term.src: - if re.search(r"\w",term.src): + if re.search(r"\w", term.src): job = {'type': 'text', 'slug': 'single::English to ' + LANG_CODE_MAPPING[term.lang][1], 'tier': tools.ustr(gengo_parameter_pool.company_id.gengo_tier), @@ -109,7 +109,7 @@ class base_update_translation(osv.osv_memory): jobs.update({term.id: job}) return {'jobs': jobs} - def check_lang_support(self, cr, uid, langs, context=None): + def check_lang_support(self, cr, uid, langs, context=None):s new_langs = [] flag, gengo = self.gengo_authentication(cr, uid, context) if not flag: @@ -152,8 +152,6 @@ class base_update_translation(osv.osv_memory): 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.info('') else: _logger.error(gengo) return True @@ -165,8 +163,8 @@ class base_update_translation(osv.osv_memory): 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) + 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: @@ -180,18 +178,23 @@ class base_update_translation(osv.osv_memory): 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 already 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 successfully.", res.lang) + lang_name = self._get_lang_name(cr, uid, res.lang) + try: + if LANG_CODE_MAPPING[res.lang][0]: + lang_search = lang_pool.search(cr, uid, [('gengo_sync', '=', True), ('id', '=', lang_id[0])]) + if lang_search: + msg += 'This language " %s " is already in queue for processing.' % (lang_name) + else: + msg += 'Translation for language " %s " is queued for processing.' % (lang_name) + lang_pool.write(cr, uid, lang_id, {'gengo_sync': True}) + _logger.info('Your translation request for language " %s " has been send successfully.', lang_name) + + 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) + except: + msg +='Language " %s " is not supported by MyGengo.'%(lang_name) - 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')]) From 5022cdd8c7fc703d475a86b73df062591aac70e3 Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Tue, 28 Aug 2012 15:48:16 +0530 Subject: [PATCH 21/40] [FIX] Impoeved the message bzr revid: jam@tinyerp.com-20120828101816-hh5qgj5x1gu1oooc --- addons/base_gengo/res_company_view.xml | 2 +- .../wizard/gengo_update_translation.py | 41 ++++++++----------- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/addons/base_gengo/res_company_view.xml b/addons/base_gengo/res_company_view.xml index 60cd767b140..d49d35d4b1f 100644 --- a/addons/base_gengo/res_company_view.xml +++ b/addons/base_gengo/res_company_view.xml @@ -14,7 +14,7 @@ - + diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index f75ea44f8b9..4eb9c514d63 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -94,23 +94,20 @@ class base_update_translation(osv.osv_memory): 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 + auto_approve = gengo_parameter_pool.company_id.gengo_auto_approve and 1 or 0 for term in translation_pool.browse(cr, uid, term_ids, context): - if term.src: - if re.search(r"\w", term.src): - job = {'type': 'text', - 'slug': 'single::English to ' + LANG_CODE_MAPPING[term.lang][1], - 'tier': tools.ustr(gengo_parameter_pool.company_id.gengo_tier), - 'body_src': term.src, - 'lc_src': 'en', - 'lc_tgt': LANG_CODE_MAPPING[term.lang][0], - 'auto_approve': auto_approve, - 'comment': gengo_parameter_pool.company_id.gengo_comment} - jobs.update({term.id: job}) + if re.search(r"\w", term.src or ""): + job = {'type': 'text', + 'slug': 'single::English to ' + LANG_CODE_MAPPING[term.lang][1], + 'tier': tools.ustr(gengo_parameter_pool.company_id.gengo_tier), + 'body_src': term.src, + 'lc_src': 'en', + 'lc_tgt': LANG_CODE_MAPPING[term.lang][0], + '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): @@ -123,7 +120,6 @@ class base_update_translation(osv.osv_memory): 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']: @@ -134,9 +130,9 @@ 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 jobs in response['jobs']: for t_id, res in jobs.items(): + vals = {} if tier == "machine": vals.update({'value': res['body_tgt'], 'state': 'translated'}) else: @@ -187,17 +183,16 @@ class base_update_translation(osv.osv_memory): if LANG_CODE_MAPPING[res.lang][0]: lang_search = lang_pool.search(cr, uid, [('gengo_sync', '=', True), ('id', '=', lang_id[0])]) if lang_search: - msg += '\t- This language " %s " is already in queue for processing.' % (lang_name) + msg += ' - This language `%s` is already in queue for translation.' % (lang_name) else: - msg += '\t- Translation for language " %s " is queued for processing.' % (lang_name) + msg += ' - The language `%s` is queued for translation through Gengo translation.' % (lang_name) lang_pool.write(cr, uid, lang_id, {'gengo_sync': True}) - _logger.info('Your translation request for language " %s " has been send successfully.', lang_name) - + _logger.info('Translation request for language `%s` has been queued successfully.', lang_name) 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) except: - msg +='\t- Language " %s " is not supported by MyGengo.'%(lang_name) + msg +=' - The Language `%s` is not supported by Gengo Traditional Service.'%(lang_name) context.update({'message': msg}) obj_model = self.pool.get('ir.model.data') @@ -230,7 +225,7 @@ class base_update_translation(osv.osv_memory): vals={} job_response = gengo.getTranslationJob(id=term.job_id) if job_response['opstat'] != 'ok': - _logger.warning("Invalid Response Skeeping translation Terms for 'id' %s."%(term.job_id)) + _logger.warning("Invalid Response! Skipping translation Terms with `id` %s."%(term.job_id)) continue if job_response['response']['job']['status'] == 'approved': vals.update({'state': 'translated', From 26406e3b0dc0b475f43ac8bdd6c2804f7414b222 Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Tue, 28 Aug 2012 15:50:46 +0530 Subject: [PATCH 22/40] [REN] Renamed the state field access key names bzr revid: jam@tinyerp.com-20120828102046-rcedv72s3u1mtl7i --- addons/base_gengo/wizard/gengo_update_message.py | 3 +-- addons/base_gengo/wizard/gengo_update_translation.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/base_gengo/wizard/gengo_update_message.py b/addons/base_gengo/wizard/gengo_update_message.py index 88fb0283825..45d54ffc54b 100644 --- a/addons/base_gengo/wizard/gengo_update_message.py +++ b/addons/base_gengo/wizard/gengo_update_message.py @@ -30,7 +30,7 @@ class gengo_update_message(osv.osv_memory): _description = "Update Message" _columns = { 'name': fields.text('Message', readonly=True), - } + } def default_get(self, cr, uid, fields, context=None): if context == None: @@ -39,6 +39,5 @@ class gengo_update_message(osv.osv_memory): 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 4eb9c514d63..e1b2c31f029 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -252,7 +252,7 @@ class base_update_translation(osv.osv_memory): 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.check_lang_support(cr, uid, langs) - term_ids = translation_pool.search(cr, uid, [('state', '=', 'translate'), ('gengo_translation', '=', True), ('lang', 'in', langs)], limit=LIMIT) + term_ids = translation_pool.search(cr, uid, [('state', '=', 'to_translate'), ('gengo_translation', '=', True), ('lang', 'in', langs)], limit=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)) From 3e682f4ef6c49e82f04e07bbe565559c1857f9d7 Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Tue, 28 Aug 2012 16:13:35 +0530 Subject: [PATCH 23/40] [FIX] Imrpoved the tooltiop and renmed conflicts label bzr revid: jam@tinyerp.com-20120828104335-e9p9xoxu4rfg6dqf --- addons/base_gengo/res_company_view.xml | 2 +- addons/base_gengo/res_lang.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/base_gengo/res_company_view.xml b/addons/base_gengo/res_company_view.xml index d49d35d4b1f..d78470c8b14 100644 --- a/addons/base_gengo/res_company_view.xml +++ b/addons/base_gengo/res_company_view.xml @@ -14,7 +14,7 @@ - + diff --git a/addons/base_gengo/res_lang.py b/addons/base_gengo/res_lang.py index e9c88c9fd29..43b867c4f76 100644 --- a/addons/base_gengo/res_lang.py +++ b/addons/base_gengo/res_lang.py @@ -27,5 +27,5 @@ class res_company(osv.Model): _inherit = "res.lang" _columns = { - 'gengo_sync': fields.boolean('Active', help='Synchronize Translation Periodically') + 'gengo_sync': fields.boolean('Gengo Auto Synchronize ?', help='If checked the language will be automatically synchronize translation periodically using gengo translation services.') } From 13bcfc30e022d726462527556076119831d7af6d Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Tue, 28 Aug 2012 16:34:26 +0530 Subject: [PATCH 24/40] [IMP] Added limit flaxibility via schedular service to raise request response limit portable bzr revid: jam@tinyerp.com-20120828110426-w10cikelphjuijg9 --- .../base_gengo/gengo_sync_schedular_data.xml | 6 +++-- .../wizard/gengo_update_translation.py | 26 ++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/addons/base_gengo/gengo_sync_schedular_data.xml b/addons/base_gengo/gengo_sync_schedular_data.xml index 2a12626713c..78d2c602ac5 100644 --- a/addons/base_gengo/gengo_sync_schedular_data.xml +++ b/addons/base_gengo/gengo_sync_schedular_data.xml @@ -5,22 +5,24 @@ Gengo Sync Translation (Response) - 30 + 20 minutes -1 + Gengo Sync Translation (Request) - 30 + 20 minutes -1 + diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index e1b2c31f029..cb11e3bf2d7 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -33,8 +33,6 @@ import time _logger = logging.getLogger(__name__) -LIMIT = 20 - LANG_CODE_MAPPING = { 'ar_SA': ('ar', 'Arabic'), 'id_ID': ('id', 'Indonesian'), @@ -60,11 +58,12 @@ LANG_CODE_MAPPING = { CRON_VALS = { 'name': 'Gengo Sync', 'active': True, - 'interval_number': 30, + 'interval_number': 20, 'interval_type': 'minutes', 'numbercall': -1, 'model': "'base.update.translations'", - 'function': "" + 'function': "", + 'args': "'(20,)'", } @@ -190,7 +189,7 @@ class base_update_translation(osv.osv_memory): _logger.info('Translation request for language `%s` has been queued successfully.', lang_name) 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) + self._sync_request(cr, uid, limit=20) except: msg +=' - The Language `%s` is not supported by Gengo Traditional Service.'%(lang_name) @@ -208,18 +207,19 @@ class base_update_translation(osv.osv_memory): 'context': context, } - def _sync_response(self, cr, uid, ids=False, context=None): + def _sync_response(self, cr, uid, limit=20, context=None): """ This method will be call by cron services to get translation from gengo for translation terms which are posted to be translated. It will read translated terms and comments from gengo and will update respective - translation in openerp """ + translation in openerp. + """ translation_pool = self.pool.get('ir.translation') flag, gengo = self.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=LIMIT, context=context) + translation_id = translation_pool.search(cr, uid, [('state', '=', 'inprogress'), ('gengo_translation', '=', True)], limit=limit, context=context) for term in translation_pool.browse(cr, uid, translation_id, context): if term.job_id: vals={} @@ -241,9 +241,11 @@ class base_update_translation(osv.osv_memory): translation_pool.write(cr, uid, term.id,vals) return True - 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""" + def _sync_request(self, cr, uid, limit=20, 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') @@ -252,7 +254,7 @@ class base_update_translation(osv.osv_memory): 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.check_lang_support(cr, uid, langs) - term_ids = translation_pool.search(cr, uid, [('state', '=', 'to_translate'), ('gengo_translation', '=', True), ('lang', 'in', langs)], limit=LIMIT) + term_ids = translation_pool.search(cr, uid, [('state', '=', 'to_translate'), ('gengo_translation', '=', True), ('lang', 'in', langs)], limit=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)) From 9c0ee11cbb5b8a097f2634cacba7fc2b94a06a14 Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Tue, 28 Aug 2012 17:07:55 +0530 Subject: [PATCH 25/40] [FIX/IMP] Impoved the code and updated the usabality bzr revid: jam@tinyerp.com-20120828113755-eaazn33wrdrw17xb --- addons/base_gengo/ir_translation.py | 8 ++++---- addons/base_gengo/ir_translation.xml | 4 ++-- addons/base_gengo/res_company.py | 4 ++-- addons/base_gengo/res_company_view.xml | 4 ++-- .../base_gengo/wizard/gengo_update_translation.py | 14 +++++++++----- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index 297e449ecdc..edf939b3851 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -26,10 +26,10 @@ class ir_translation(osv.Model): _name = "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), + 'gengo_comment': fields.text("Comments & Activity"), + 'gengo_translation': fields.boolean("Gengo Auto Translation ?", help='If checked the term will be translated by Gengo automatically.'), + 'gengo_control': fields.boolean('Gengo Traslated', help="If Term is translated using Gengo Service, the check box will be checked.", readonly=True), + 'job_id': fields.char('Gengo JobId', size=32), } _defaults = { diff --git a/addons/base_gengo/ir_translation.xml b/addons/base_gengo/ir_translation.xml index 30108c882b5..8a0e6a238b8 100644 --- a/addons/base_gengo/ir_translation.xml +++ b/addons/base_gengo/ir_translation.xml @@ -20,8 +20,8 @@ ir.translation - - + + diff --git a/addons/base_gengo/res_company.py b/addons/base_gengo/res_company.py index 9062095bb87..058a12bd6e8 100644 --- a/addons/base_gengo/res_company.py +++ b/addons/base_gengo/res_company.py @@ -31,8 +31,8 @@ class res_company(osv.Model): "gengo_tier": fields.selection([('machine', 'Machine'), ('standard', 'Standard'), ('pro', 'Pro'), - ('ultra', 'Ultra')], "Tier types", required=True), - "gengo_comment": fields.text("comments"), + ('ultra', 'Ultra')], "Tier Type", required=True), + "gengo_comment": fields.text("Comments"), "gengo_auto_approve": fields.boolean("Auto Approve Translation ?", help="Jobs are Automatically Approved by Gengo."), } diff --git a/addons/base_gengo/res_company_view.xml b/addons/base_gengo/res_company_view.xml index d78470c8b14..fdc0c8833a6 100644 --- a/addons/base_gengo/res_company_view.xml +++ b/addons/base_gengo/res_company_view.xml @@ -21,8 +21,8 @@ - - + + diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index cb11e3bf2d7..52c6e5b7fd8 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -127,7 +127,7 @@ class base_update_translation(osv.osv_memory): new_langs.append(l) return list(set(new_langs)) - def _update_terms(self, cr, uid, ids, response, tier, context): + def _update_terms(self, cr, uid, response, tier, context): translation_pool = self.pool.get('ir.translation') for jobs in response['jobs']: for t_id, res in jobs.items(): @@ -139,7 +139,7 @@ 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, term_ids, context): + def _send_translation_terms(self, cr, uid, term_ids, context): """ Lazy Polling will be perform when user or cron request for the translation. """ @@ -150,7 +150,7 @@ class base_update_translation(osv.osv_memory): if request['jobs']: result = gengo.postTranslationJobs(jobs=request) if result['opstat'] == 'ok': - self._update_terms(cr, uid, ids, result['response'], user.company_id.gengo_tier, context) + self._update_terms(cr, uid, result['response'], user.company_id.gengo_tier, context) else: _logger.error(gengo) return True @@ -221,6 +221,7 @@ class base_update_translation(osv.osv_memory): else: translation_id = translation_pool.search(cr, uid, [('state', '=', 'inprogress'), ('gengo_translation', '=', True)], limit=limit, context=context) for term in translation_pool.browse(cr, uid, translation_id, context): + up_term = up_comment = 0 if term.job_id: vals={} job_response = gengo.getTranslationJob(id=term.job_id) @@ -231,14 +232,17 @@ class base_update_translation(osv.osv_memory): vals.update({'state': 'translated', 'value': job_response['response']['job']['body_tgt'], 'gengo_control': True}) + 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 by %s at %s. \n' %(comment['body'],comment['author'],time.ctime(comment['ctime'])) + gengo_comments+='%s Commented on %s by %s. \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 Comments for `%d` terms."%(up_term, up_comment )) return True def _sync_request(self, cr, uid, limit=20, context=None): @@ -256,7 +260,7 @@ class base_update_translation(osv.osv_memory): langs = self.check_lang_support(cr, uid, langs) term_ids = translation_pool.search(cr, uid, [('state', '=', 'to_translate'), ('gengo_translation', '=', True), ('lang', 'in', langs)], limit=limit) if term_ids: - self._send_translation_terms(cr, uid, ids, term_ids, context) + self._send_translation_terms(cr, uid, term_ids, context) _logger.info("Translation terms %s has been posted to gengo successfully", len(term_ids)) else: _logger.info('No Translation terms to process.') From eb5b3f57330fb12d75673a2e07cf40d299b997fc Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 29 Aug 2012 10:26:47 +0200 Subject: [PATCH 26/40] [REF] base_gengo: misc code improvements made during code review bzr revid: qdp-launchpad@openerp.com-20120829082647-rzl1btht2xc05ee4 --- addons/base_gengo/res_company.py | 6 +- .../wizard/gengo_update_translation.py | 99 +++++++++++-------- 2 files changed, 59 insertions(+), 46 deletions(-) diff --git a/addons/base_gengo/res_company.py b/addons/base_gengo/res_company.py index 058a12bd6e8..610e46d05d2 100644 --- a/addons/base_gengo/res_company.py +++ b/addons/base_gengo/res_company.py @@ -26,13 +26,13 @@ class res_company(osv.Model): _name = "res.company" _inherit = "res.company" _columns = { - "gengo_private_key": fields.text("Gengo private key"), - "gengo_public_key": fields.text("Gengo public key"), + "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 Type", required=True), - "gengo_comment": fields.text("Comments"), + "gengo_comment": fields.text("Comments", help="This comment will be automatically be enclosed in each an every request sent to Gengo"), "gengo_auto_approve": fields.boolean("Auto Approve Translation ?", help="Jobs are Automatically Approved by Gengo."), } diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index 52c6e5b7fd8..2299af02480 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -33,6 +33,8 @@ import time _logger = logging.getLogger(__name__) +GENGO_DEFAULT_LIMIT = 20 + LANG_CODE_MAPPING = { 'ar_SA': ('ar', 'Arabic'), 'id_ID': ('id', 'Indonesian'), @@ -56,14 +58,14 @@ LANG_CODE_MAPPING = { } CRON_VALS = { - 'name': 'Gengo Sync', + 'name': _('Synchronization with Gengo'), 'active': True, 'interval_number': 20, 'interval_type': 'minutes', 'numbercall': -1, 'model': "'base.update.translations'", 'function': "", - 'args': "'(20,)'", + 'args': "'(20,)'",#not sure } @@ -75,11 +77,11 @@ class base_update_translation(osv.osv_memory): 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 sign up to gengo and get public and private - key which is provided by gengo to authentic user ''' + key which is provided by gengo to authenticate user ''' - user = self.pool.get('res.users').browse(cr, uid, uid, context) + user = self.pool.get('res.users').browse(cr, uid, uid, context=context) if not user.company_id.gengo_public_key or not user.company_id.gengo_private_key: - return (False, " - Invalid gengo configuration, Either Gengo authentication `Public Key` or `Private Key` is missing. Complete Gengo authentication parameter under `Settings > Companies > Gengo Parameters`.") + return (False, _(" - Invalid Gengo configuration. Gengo authentication `Public Key` or `Private Key` is missing. Complete Gengo authentication parameters under `Settings > Companies > Gengo Parameters`.")) try: gengo = MyGengo( public_key=user.company_id.gengo_public_key.encode('ascii'), @@ -89,24 +91,32 @@ class base_update_translation(osv.osv_memory): gengo.getAccountStats() return (True, gengo) except Exception, e: - return (False, "Gengo Connection Error\n%s"%e) + return (False, _("Gengo Connection Error\n%s") %e) + + def pack_jobs_request(self, cr, uid, term_ids, context=None): + ''' prepare the terms that will be requested to gengo and returns them in a dictionary with following format + {'jobs': { + 'term1.id': {...} + 'term2.id': {...} + } + }''' - def pack_jobs_request(self, cr, uid, term_ids, context): - jobs = {} - gengo_parameter_pool = self.pool.get('res.users').browse(cr, uid, uid, context) translation_pool = self.pool.get('ir.translation') - auto_approve = gengo_parameter_pool.company_id.gengo_auto_approve and 1 or 0 - for term in translation_pool.browse(cr, uid, term_ids, context): + jobs = {} + user = self.pool.get('res.users').browse(cr, uid, uid, context=context) + auto_approve = 1 if user.company_id.gengo_auto_approve or 0 + for term in translation_pool.browse(cr, uid, term_ids, context=context): if re.search(r"\w", term.src or ""): - job = {'type': 'text', + jobs[term.id] = {'type': 'text', 'slug': 'single::English to ' + LANG_CODE_MAPPING[term.lang][1], - 'tier': tools.ustr(gengo_parameter_pool.company_id.gengo_tier), + 'tier': tools.ustr(user.company_id.gengo_tier), + #'tier': tools.ustr(term.gengo_tier), 'body_src': term.src, 'lc_src': 'en', 'lc_tgt': LANG_CODE_MAPPING[term.lang][0], 'auto_approve': auto_approve, - 'comment': gengo_parameter_pool.company_id.gengo_comment} - jobs.update({term.id: job}) + 'comment': gengo_parameter_pool.company_id.gengo_comment, + } return {'jobs': jobs} def check_lang_support(self, cr, uid, langs, context=None): @@ -115,35 +125,38 @@ class base_update_translation(osv.osv_memory): if not flag: return [] else: - user = self.pool.get('res.users').browse(cr, uid, uid, context) + user = self.pool.get('res.users').browse(cr, uid, uid, context=context) tier = user.company_id.gengo_tier if tier == "machine": tier = "nonprofit" lang_pair = gengo.getServiceLanguagePairs(lc_src='en') + #print "tier", tier + if lang_pair['opstat'] == 'ok': for g_lang in lang_pair['response']: + #print 'g_lang', g_lang['lc_tgt'], g_lang['tier'] for l in langs: if LANG_CODE_MAPPING[l][0] == g_lang['lc_tgt'] and g_lang['tier'] == tier: new_langs.append(l) return list(set(new_langs)) - def _update_terms(self, cr, uid, response, tier, context): + def _update_terms(self, cr, uid, response, tier, context=None): translation_pool = self.pool.get('ir.translation') - for jobs in response['jobs']: + for jobs in response['jobs']: for t_id, res in jobs.items(): vals = {} 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) + translation_pool.write(cr, uid, [t_id], vals, context=context) return - def _send_translation_terms(self, cr, uid, term_ids, context): + def _send_translation_terms(self, cr, uid, term_ids, context=None): """ Lazy Polling will be perform when user or cron request for the translation. """ - user = self.pool.get('res.users').browse(cr, uid, uid, context) + user = self.pool.get('res.users').browse(cr, uid, uid, context=context) flag, gengo = self.gengo_authentication(cr, uid, context) if flag: request = self.pack_jobs_request(cr, uid, term_ids, context) @@ -170,33 +183,33 @@ class base_update_translation(osv.osv_memory): context = {} lang_pool = self.pool.get('res.lang') super(base_update_translation, self).act_update(cr, uid, ids, context) - msg = "1. Translation file loaded successfully.\n2. Processing Gengo Translation:\n" + msg = _("1. Translation file loaded successfully.\n2. Processing Gengo Translation:\n") flag, gengo = self.gengo_authentication(cr, uid, context) if not flag: msg += gengo else: - for res in self.browse(cr, uid, ids, context): + for res in self.browse(cr, uid, ids, context=context): lang_id = lang_pool.search(cr, uid, [('code', '=', res.lang)]) lang_name = self._get_lang_name(cr, uid, res.lang) try: if LANG_CODE_MAPPING[res.lang][0]: lang_search = lang_pool.search(cr, uid, [('gengo_sync', '=', True), ('id', '=', lang_id[0])]) if lang_search: - msg += ' - This language `%s` is already in queue for translation.' % (lang_name) + msg += _(' - This language `%s` is already in queue for translation.') % (lang_name) else: - msg += ' - The language `%s` is queued for translation through Gengo translation.' % (lang_name) + msg += _(' - The language `%s` is queued for translation through Gengo translation.') % (lang_name) lang_pool.write(cr, uid, lang_id, {'gengo_sync': True}) _logger.info('Translation request for language `%s` has been queued successfully.', lang_name) - 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, limit=20) + 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, limit=GENGO_DEFAULT_LIMIT) except: - msg +=' - The Language `%s` is not supported by Gengo Traditional Service.'%(lang_name) + msg += _(' - The Language `%s` is not supported by Gengo Traditional Service.') % (lang_name) - 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'] + context.update({'message': msg}) return { 'view_type': 'form', 'view_mode': 'form', @@ -207,7 +220,7 @@ class base_update_translation(osv.osv_memory): 'context': context, } - def _sync_response(self, cr, uid, limit=20, context=None): + def _sync_response(self, cr, uid, limit=GENGO_DEFAULT_LIMIT, context=None): """ This method will be call by cron services to get translation from gengo for translation terms which are posted to be translated. It will @@ -226,7 +239,7 @@ class base_update_translation(osv.osv_memory): vals={} job_response = gengo.getTranslationJob(id=term.job_id) if job_response['opstat'] != 'ok': - _logger.warning("Invalid Response! Skipping translation Terms with `id` %s."%(term.job_id)) + _logger.warning("Invalid Response! Skipping translation Terms with `id` %s." % (term.job_id)) continue if job_response['response']['job']['status'] == 'approved': vals.update({'state': 'translated', @@ -237,27 +250,27 @@ class base_update_translation(osv.osv_memory): if job_comment['opstat']=='ok': gengo_comments="" for comment in job_comment['response']['thread']: - gengo_comments+='%s Commented on %s by %s. \n'%(comment['body'], time.ctime(comment['ctime']), comment['author']) - vals.update({'gengo_comment':gengo_comments}) + gengo_comments += _('%s Commented on %s by %s. \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 Comments for `%d` terms."%(up_term, up_comment )) + _logger.info("Successfully Updated `%d` terms and Comments for `%d` terms." % (up_term, up_comment )) return True - def _sync_request(self, cr, uid, limit=20, context=None): - """ - This scheduler will send a job request to the gengo , which terms are - in translate state and gengo_translation is true - """ + def _sync_request(self, cr, uid, limit=GENGO_DEFAULT_LIMIT, context=None): + """This scheduler will send a job request to the gengo , which terms are + waiing to be translated and for which gengo_translation is True""" if context is None: context = {} language_pool = self.pool.get('res.lang') translation_pool = self.pool.get('ir.translation') try: - 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.check_lang_support(cr, uid, langs) + lang_ids = language_pool.search(cr, uid, [('gengo_sync', '=', True)]) #really? what's the point not checking ALL the languages if gengo support it? i feel like it's aunecessary load for the user that must configure yet another thing + langs = [lang.code for lang in language_pool.browse(cr, uid, lang_ids, context=context)] + #print "LANGS 1", langs + langs = self.check_lang_support(cr, uid, langs, context=context)#must move + #print "LANGS 2", langs term_ids = translation_pool.search(cr, uid, [('state', '=', 'to_translate'), ('gengo_translation', '=', True), ('lang', 'in', langs)], limit=limit) if term_ids: self._send_translation_terms(cr, uid, term_ids, context) From db08eb4d0a40b15557505bbddbac05f6ff04f91f Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 29 Aug 2012 11:50:22 +0200 Subject: [PATCH 27/40] [REF] base_gengo: misc code improvements made during code review bzr revid: qdp-launchpad@openerp.com-20120829095022-i3fsdc0nvok78q25 --- addons/base_gengo/ir_translation.py | 7 +------ addons/base_gengo/ir_translation.xml | 11 ++++------- addons/base_gengo/wizard/gengo_update_translation.py | 6 +++--- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index edf939b3851..c8a5f9ef070 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -26,12 +26,7 @@ class ir_translation(osv.Model): _name = "ir.translation" _inherit = "ir.translation" _columns = { - 'gengo_comment': fields.text("Comments & Activity"), 'gengo_translation': fields.boolean("Gengo Auto Translation ?", help='If checked the term will be translated by Gengo automatically.'), - 'gengo_control': fields.boolean('Gengo Traslated', help="If Term is translated using Gengo Service, the check box will be checked.", readonly=True), + 'gengo_comment': fields.text("Comments & Activity Linked to Gengo"), 'job_id': fields.char('Gengo JobId', size=32), } - - _defaults = { - 'gengo_control': False, - } diff --git a/addons/base_gengo/ir_translation.xml b/addons/base_gengo/ir_translation.xml index 8a0e6a238b8..6725504df8a 100644 --- a/addons/base_gengo/ir_translation.xml +++ b/addons/base_gengo/ir_translation.xml @@ -7,8 +7,7 @@ - - + @@ -20,12 +19,10 @@ ir.translation - - - - + - + diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index 2299af02480..357d2a5bf74 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -65,7 +65,7 @@ CRON_VALS = { 'numbercall': -1, 'model': "'base.update.translations'", 'function': "", - 'args': "'(20,)'",#not sure + 'args': "'(%s,)'" %s GENGO_DEFAULT_LIMIT, } @@ -175,6 +175,7 @@ class base_update_translation(osv.osv_memory): 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: + #the cron job was not found, probably deleted previously, so we create it again using default values CRON_VALS.update({'name': name, "function": fn}) return cron_pool.create(cr, uid, CRON_VALS, context) @@ -243,8 +244,7 @@ class base_update_translation(osv.osv_memory): continue if job_response['response']['job']['status'] == 'approved': vals.update({'state': 'translated', - 'value': job_response['response']['job']['body_tgt'], - 'gengo_control': True}) + 'value': job_response['response']['job']['body_tgt']) up_term += 1 job_comment = gengo.getTranslationJobComments(id=term.job_id) if job_comment['opstat']=='ok': From 55cc723fc183c888cfc57fa2d78654a79c029132 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 29 Aug 2012 11:51:37 +0200 Subject: [PATCH 28/40] [FIX] base_gengo: syntax error fixed bzr revid: qdp-launchpad@openerp.com-20120829095137-hy91xbg1gicwzid2 --- addons/base_gengo/wizard/gengo_update_translation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index 357d2a5bf74..23e66a9489d 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -104,7 +104,7 @@ class base_update_translation(osv.osv_memory): translation_pool = self.pool.get('ir.translation') jobs = {} user = self.pool.get('res.users').browse(cr, uid, uid, context=context) - auto_approve = 1 if user.company_id.gengo_auto_approve or 0 + 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', From f1febea2a3a5cef2585a097738eff52d90da4840 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 29 Aug 2012 12:10:03 +0200 Subject: [PATCH 29/40] [FIX] base_gengo: syntax error fixed bzr revid: qdp-launchpad@openerp.com-20120829101003-3t7zpydsg6lk3ap1 --- addons/base_gengo/wizard/gengo_update_translation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/gengo_update_translation.py index 23e66a9489d..a7c8deb0348 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/gengo_update_translation.py @@ -65,7 +65,7 @@ CRON_VALS = { 'numbercall': -1, 'model': "'base.update.translations'", 'function': "", - 'args': "'(%s,)'" %s GENGO_DEFAULT_LIMIT, + 'args': "'(%s,)'" % (str(GENGO_DEFAULT_LIMIT)), } @@ -244,7 +244,7 @@ class base_update_translation(osv.osv_memory): continue if job_response['response']['job']['status'] == 'approved': vals.update({'state': 'translated', - 'value': job_response['response']['job']['body_tgt']) + 'value': job_response['response']['job']['body_tgt']}) up_term += 1 job_comment = gengo.getTranslationJobComments(id=term.job_id) if job_comment['opstat']=='ok': From 1c3f30a081c779618b892322924951c88ae9b063 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Thu, 30 Aug 2012 18:14:29 +0200 Subject: [PATCH 30/40] [IMP] base_gengo: lots of changes made during the code review. Among * database scheme simplification * merge of boolean on ir.translation and selection fields on res.company to select the tier (level service of gengo), which is now located on ir.translation * move of all the new features in a new wizard * removal of wizard to display the results bzr revid: qdp-launchpad@openerp.com-20120830161429-h7rti6hbnrk8mozg --- addons/base_gengo/__openerp__.py | 4 +- addons/base_gengo/ir_translation.py | 60 +++- addons/base_gengo/wizard/__init__.py | 3 +- .../base_gengo/wizard/alert_message_gengo.xml | 17 - ...anslation.py => base_gengo_translation.py} | 323 ++++++++---------- .../wizard/base_gengo_translation_view.xml | 39 +++ .../base_gengo/wizard/gengo_update_message.py | 43 --- 7 files changed, 249 insertions(+), 240 deletions(-) delete mode 100644 addons/base_gengo/wizard/alert_message_gengo.xml rename addons/base_gengo/wizard/{gengo_update_translation.py => base_gengo_translation.py} (50%) create mode 100644 addons/base_gengo/wizard/base_gengo_translation_view.xml delete mode 100644 addons/base_gengo/wizard/gengo_update_message.py diff --git a/addons/base_gengo/__openerp__.py b/addons/base_gengo/__openerp__.py index 1173d513493..d2e5893d166 100644 --- a/addons/base_gengo/__openerp__.py +++ b/addons/base_gengo/__openerp__.py @@ -34,12 +34,14 @@ Automated Translations through Gengo API 'res_company_view.xml', 'res_lang_view.xml', - 'wizard/alert_message_gengo.xml', + 'wizard/base_gengo_translation_view.xml', ], 'demo_xml': [], 'test': [], 'installable': True, 'auto_install': False, + #'qweb': ['static/src/xml/base_gengo.xml'], + #'js': ['static/src/js/base_gengo.js'], } # 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 c8a5f9ef070..8f896ec561d 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -21,12 +21,70 @@ from osv import fields, osv +LANG_CODE_MAPPING = { + 'ar_SA': ('ar', 'Arabic'), + 'id_ID': ('id', 'Indonesian'), + 'nl_NL': ('nl', 'Dutch'), + 'fr_CA': ('fr-ca', 'French (Canada)'), + 'pl_PL': ('pl', 'Polish'), + 'zh_TW': ('zh-tw', 'Chinese (Traditional)'), + 'sv_SE': ('sv', 'Swedish'), + 'ko_KR': ('ko', 'Korean'), + 'pt_PT': ('pt', 'Portuguese (Europe)'), + 'en_US': ('en', 'English'), + 'ja_JP': ('ja', 'Japanese'), + 'es_ES': ('es', 'Spanish (Spain)'), + 'zh_CN': ('zh', 'Chinese (Simplified)'), + 'de_DE': ('de', 'German'), + 'fr_FR': ('fr', 'French'), + 'fr_BE': ('fr', 'French'), + 'ru_RU': ('ru', 'Russian'), + 'it_IT': ('it', 'Italian'), + 'pt_BR': ('pt-br', 'Portuguese (Brazil)') +} class ir_translation(osv.Model): _name = "ir.translation" _inherit = "ir.translation" _columns = { - 'gengo_translation': fields.boolean("Gengo Auto Translation ?", help='If checked the term will be translated by Gengo automatically.'), 'gengo_comment': fields.text("Comments & Activity Linked to Gengo"), 'job_id': fields.char('Gengo JobId', size=32), + "gengo_translation": fields.selection([('', 'Do not translate this term by Gengo'), + ('machine', 'Translation By Machine'), + ('standard', 'Standard'), + ('pro', 'Pro'), + ('ultra', 'Ultra')], "Gengo Translation Service Level", help='You can select here the service level you want for an automatic translation using Gengo.', required=True), } + _defaults = { + 'gengo_translation': '', + } + + def _get_all_supported_languages(self, cr, uid, context=None): + flag, gengo = self.pool.get('base.gengo.translations').gengo_authentication(cr, uid, context=context) + if not flag: + raise osv.except_osv(_('Gengo Authentication Error'), gengo) + supported_langs = {} + lang_pair = gengo.getServiceLanguagePairs(lc_src='en') + if lang_pair['opstat'] == 'ok': + for g_lang in lang_pair['response']: + if g_lang['lc_tgt'] not in supported_langs: + supported_langs[g_lang['lc_tgt']] = [] + supported_langs[g_lang['lc_tgt']] += [g_lang['tier']] + return supported_langs + + def _get_gengo_corresponding_language(cr, lang): + return lang in LANG_CODE_MAPPING and LANG_CODE_MAPPING[lang][0] or lang + + def _check_lang_support(self, cr, uid, ids, context=None): + supported_langs = self._get_all_supported_languages(cr, uid, context=context) + if supported_langs: + for term in self.browse(cr, uid, ids, context=context): + tier = "nonprofit" if term.gengo_translation == 'machine' else term.gengo_translation + language = self._get_gengo_corresponding_language(term.lang) + if tier not in supported_langs.get(language,[]): + return False + return True + + _constraints = [ + (_check_lang_support, 'The Gengo translation service selected is not supported for this language.', ['gengo_translation']) + ] diff --git a/addons/base_gengo/wizard/__init__.py b/addons/base_gengo/wizard/__init__.py index f661b3b8114..e3cd1565124 100644 --- a/addons/base_gengo/wizard/__init__.py +++ b/addons/base_gengo/wizard/__init__.py @@ -19,7 +19,6 @@ # ############################################################################## -import gengo_update_translation -import gengo_update_message +import base_gengo_translation # 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 deleted file mode 100644 index c2121b8ce6d..00000000000 --- a/addons/base_gengo/wizard/alert_message_gengo.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - gengo.update.message.form - gengo.update.message - - - - - - - - - - diff --git a/addons/base_gengo/wizard/gengo_update_translation.py b/addons/base_gengo/wizard/base_gengo_translation.py similarity index 50% rename from addons/base_gengo/wizard/gengo_update_translation.py rename to addons/base_gengo/wizard/base_gengo_translation.py index a7c8deb0348..e91be00ec47 100644 --- a/addons/base_gengo/wizard/gengo_update_translation.py +++ b/addons/base_gengo/wizard/base_gengo_translation.py @@ -19,7 +19,7 @@ # ############################################################################## -from osv import osv +from osv import osv, fields from tools.translate import _ import re try: @@ -35,53 +35,38 @@ _logger = logging.getLogger(__name__) GENGO_DEFAULT_LIMIT = 20 -LANG_CODE_MAPPING = { - 'ar_SA': ('ar', 'Arabic'), - 'id_ID': ('id', 'Indonesian'), - 'nl_NL': ('nl', 'Dutch'), - 'fr_CA': ('fr-ca', 'French (Canada)'), - 'pl_PL': ('pl', 'Polish'), - 'zh_TW': ('zh-tw', 'Chinese (Traditional)'), - 'sv_SE': ('sv', 'Swedish'), - 'ko_KR': ('ko', 'Korean'), - 'pt_PT': ('pt', 'Portuguese (Europe)'), - 'en_US': ('en', 'English'), - 'ja_JP': ('ja', 'Japanese'), - 'es_ES': ('es', 'Spanish (Spain)'), - 'zh_CN': ('zh', 'Chinese (Simplified)'), - 'de_DE': ('de', 'German'), - 'fr_FR': ('fr', 'French'), - 'fr_BE': ('fr', 'French'), - 'ru_RU': ('ru', 'Russian'), - 'it_IT': ('it', 'Italian'), - 'pt_BR': ('pt-br', 'Portuguese (Brazil)') -} - -CRON_VALS = { - 'name': _('Synchronization with Gengo'), +DEFAULT_CRON_VALS = { 'active': True, 'interval_number': 20, 'interval_type': 'minutes', - 'numbercall': -1, - 'model': "'base.update.translations'", - 'function': "", + 'model': "'base.gengo.translations'", 'args': "'(%s,)'" % (str(GENGO_DEFAULT_LIMIT)), } +class base_gengo_translations(osv.osv_memory): -class base_update_translation(osv.osv_memory): - - _name = 'base.update.translations' - _inherit = "base.update.translations" + _name = 'base.gengo.translations' + _columns = { + 'restart_send_job': fields.boolean("Restart Sending Job"), + 'restart_fetch_job': fields.boolean("Restart Fetching Job"), + 'lang_id': fields.many2one('res.lang', 'Language', help="Leave empty if you don't want to restrict the request to a single language"), + } 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 sign up to gengo and get public and private - key which is provided by gengo to authenticate user ''' + ''' + This method tries to open a connection with Gengo. For that, it uses the Public and Private + keys that are linked to the company (given by Gengo on subscription). It returns a tuple with + * as first element: a boolean depicting if the authentication was a success or not + * as second element: the connection, if it was a success, or the error message returned by + Gengo when the connection failed. + This error message can either be displayed in the server logs (if the authentication was called + by the cron) or in a dialog box (if requested by the user), thus it's important to return it + translated. + ''' user = self.pool.get('res.users').browse(cr, uid, uid, context=context) if not user.company_id.gengo_public_key or not user.company_id.gengo_private_key: - return (False, _(" - Invalid Gengo configuration. Gengo authentication `Public Key` or `Private Key` is missing. Complete Gengo authentication parameters under `Settings > Companies > Gengo Parameters`.")) + return (False, _("Invalid Gengo configuration. Gengo authentication `Public Key` or `Private Key` is missing. Complete Gengo authentication parameters under `Settings > Companies > Gengo Parameters`.")) try: gengo = MyGengo( public_key=user.company_id.gengo_public_key.encode('ascii'), @@ -89,10 +74,109 @@ class base_update_translation(osv.osv_memory): sandbox=True, ) gengo.getAccountStats() + return (True, gengo) except Exception, e: return (False, _("Gengo Connection Error\n%s") %e) + def do_check_schedular(self, cr, uid, xml_id, name, fn, context=None): + """ + This function is used to reset a cron to its default values, or to recreate it if it was deleted. + """ + cron_pool = self.pool.get('ir.cron') + cron_vals = DEFAULT_CRON_VALS.copy() + cron_vals.update({'name': name, "function": fn}) + try: + res = [] + model, res = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base_gengo', xml_id) + cron_pool.write(cr, uid, [res], cron_vals, context=context) + except: + #the cron job was not found, probably deleted previously, so we create it again using default values + cron_vals.update({'numbercall': -1}) + return cron_pool.create(cr, uid, cron_vals, context=context) + + def act_update(self, cr, uid, ids, context=None): + ''' + Function called by the wizard. + ''' + if context == None: + context = {} + + flag, gengo = self.gengo_authentication(cr, uid, context=context) + if not flag: + raise osv.except_osv(_('Gengo Authentication Error'), gengo) + for wizard in self.browse(cr, uid, ids, context=context): + supported_langs = self.pool.get('ir.translation')._get_all_supported_languages(cr, uid, context=context) + language = self.pool.get('ir.translation')._get_gengo_corresponding_language(wizard.lang_id.code) + if language not in supported_langs: + raise osv.except_osv(_("Warning"), _('This language is not supported by the Gengo translation services.')) + + #send immediately a new request for the selected language (if any) + ctx = context.copy() + ctx['gengo_language'] = wizard.lang_id.id + self._sync_request(cr, uid, limit=GENGO_DEFAULT_LIMIT, context=ctx) + #check the cron jobs and eventually restart/recreate them + if wizard.restart_send_job: + self.do_check_schedular(cr, uid, 'gengo_sync_send_request_scheduler', _('Gengo Sync Translation (Request)'), '_sync_request', context=context) + if wizard.restart_fetch_job: + self.do_check_schedular(cr, uid, 'gengo_sync_receive_request_scheduler', _('Gengo Sync Translation (Response)'), '_sync_response', context=context) + return {'type': 'ir.actions.act_window_close'} + + def _sync_response(self, cr, uid, limit=GENGO_DEFAULT_LIMIT, context=None): + """ + This method will be called by cron services to get translations from + Gengo. It will read translated terms and comments from Gengo and will + update respective ir.translation in openerp. + """ + translation_pool = self.pool.get('ir.translation') + flag, gengo = self.gengo_authentication(cr, uid, context=context) + if not flag: + _logger.warning("%s", gengo) + else: + translation_id = translation_pool.search(cr, uid, [('state', '=', 'inprogress'), ('gengo_translation', 'in', ('machine','standard','pro','ultra'))], limit=limit, context=context) + for term in translation_pool.browse(cr, uid, translation_id, context=context): + up_term = up_comment = 0 + if term.job_id: + vals={} + job_response = gengo.getTranslationJob(id=term.job_id) + if job_response['opstat'] != 'ok': + _logger.warning("Invalid Response! Skipping translation Terms with `id` %s." % (term.job_id)) + continue + if job_response['response']['job']['status'] == 'approved': + vals.update({'state': 'translated', + 'value': job_response['response']['job']['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\n--\n Commented on %s by %s.') % (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 )) + else: + _logger.warning("%s", 'Cannot retrieve the Gengo job ID for translation %s: %s' % (term.id, term.src)) + return True + + 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 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) + return + def pack_jobs_request(self, cr, uid, term_ids, context=None): ''' prepare the terms that will be requested to gengo and returns them in a dictionary with following format {'jobs': { @@ -108,173 +192,60 @@ class base_update_translation(osv.osv_memory): 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 ' + LANG_CODE_MAPPING[term.lang][1], - 'tier': tools.ustr(user.company_id.gengo_tier), - #'tier': tools.ustr(term.gengo_tier), + 'slug': 'single::English to ' + term.lang, + 'tier': tools.ustr(term.gengo_translation), 'body_src': term.src, 'lc_src': 'en', - 'lc_tgt': LANG_CODE_MAPPING[term.lang][0], + 'lc_tgt': translation_pool._get_gengo_corresponding_language(term.lang), 'auto_approve': auto_approve, - 'comment': gengo_parameter_pool.company_id.gengo_comment, + 'comment': user.company_id.gengo_comment, } 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=context) - tier = user.company_id.gengo_tier - if tier == "machine": - tier = "nonprofit" - lang_pair = gengo.getServiceLanguagePairs(lc_src='en') - #print "tier", tier - - if lang_pair['opstat'] == 'ok': - for g_lang in lang_pair['response']: - #print 'g_lang', g_lang['lc_tgt'], g_lang['tier'] - for l in langs: - if LANG_CODE_MAPPING[l][0] == g_lang['lc_tgt'] and g_lang['tier'] == tier: - new_langs.append(l) - return list(set(new_langs)) - - def _update_terms(self, cr, uid, response, tier, context=None): - translation_pool = self.pool.get('ir.translation') - for jobs in response['jobs']: - for t_id, res in jobs.items(): - vals = {} - 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) - return def _send_translation_terms(self, cr, uid, term_ids, context=None): """ - Lazy Polling will be perform when user or cron request for the translation. + Send a request to Gengo with all the term_ids in a different job, get the response and update the terms in + database accordingly. """ + user = self.pool.get('res.users').browse(cr, uid, uid, context=context) - flag, gengo = self.gengo_authentication(cr, uid, context) + flag, gengo = self.gengo_authentication(cr, uid, context=context) if flag: - request = self.pack_jobs_request(cr, uid, term_ids, context) + request = self.pack_jobs_request(cr, uid, term_ids, context=context) if request['jobs']: result = gengo.postTranslationJobs(jobs=request) if result['opstat'] == 'ok': - self._update_terms(cr, uid, result['response'], user.company_id.gengo_tier, context) + self._update_terms(cr, uid, result['response'], context=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 = [] - 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: - #the cron job was not found, probably deleted previously, so we create it again using default values - 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 = {} - lang_pool = self.pool.get('res.lang') - super(base_update_translation, self).act_update(cr, uid, ids, context) - msg = _("1. Translation file loaded successfully.\n2. Processing Gengo Translation:\n") - flag, gengo = self.gengo_authentication(cr, uid, context) - if not flag: - msg += gengo - else: - for res in self.browse(cr, uid, ids, context=context): - lang_id = lang_pool.search(cr, uid, [('code', '=', res.lang)]) - lang_name = self._get_lang_name(cr, uid, res.lang) - try: - if LANG_CODE_MAPPING[res.lang][0]: - lang_search = lang_pool.search(cr, uid, [('gengo_sync', '=', True), ('id', '=', lang_id[0])]) - if lang_search: - msg += _(' - This language `%s` is already in queue for translation.') % (lang_name) - else: - msg += _(' - The language `%s` is queued for translation through Gengo translation.') % (lang_name) - lang_pool.write(cr, uid, lang_id, {'gengo_sync': True}) - _logger.info('Translation request for language `%s` has been queued successfully.', lang_name) - 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, limit=GENGO_DEFAULT_LIMIT) - except: - msg += _(' - The Language `%s` is not supported by Gengo Traditional Service.') % (lang_name) - - 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'] - context.update({'message': msg}) - 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, limit=GENGO_DEFAULT_LIMIT, context=None): - """ - This method will be call by cron services to get translation from - gengo for translation terms which are posted to be translated. It will - read translated terms and comments from gengo and will update respective - translation in openerp. - """ - translation_pool = self.pool.get('ir.translation') - flag, gengo = self.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=limit, context=context) - for term in translation_pool.browse(cr, uid, translation_id, context): - up_term = up_comment = 0 - if term.job_id: - vals={} - job_response = gengo.getTranslationJob(id=term.job_id) - if job_response['opstat'] != 'ok': - _logger.warning("Invalid Response! Skipping translation Terms with `id` %s." % (term.job_id)) - continue - if job_response['response']['job']['status'] == 'approved': - vals.update({'state': 'translated', - 'value': job_response['response']['job']['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 Commented on %s by %s. \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 Comments for `%d` terms." % (up_term, up_comment )) - return True - def _sync_request(self, cr, uid, limit=GENGO_DEFAULT_LIMIT, context=None): - """This scheduler will send a job request to the gengo , which terms are - waiing to be translated and for which gengo_translation is True""" + """ + This scheduler will send a job request to the gengo , which terms are + waiing to be translated and for which gengo_translation is enabled. + + A special key 'gengo_language' can be passed in the context in order to + request only translations of that language only. Its value is the language + ID in openerp. + """ if context is None: context = {} language_pool = self.pool.get('res.lang') translation_pool = self.pool.get('ir.translation') try: - lang_ids = language_pool.search(cr, uid, [('gengo_sync', '=', True)]) #really? what's the point not checking ALL the languages if gengo support it? i feel like it's aunecessary load for the user that must configure yet another thing + #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)] - #print "LANGS 1", langs - langs = self.check_lang_support(cr, uid, langs, context=context)#must move - #print "LANGS 2", langs - term_ids = translation_pool.search(cr, uid, [('state', '=', 'to_translate'), ('gengo_translation', '=', True), ('lang', 'in', langs)], limit=limit) + #search for the n first terms to translate + term_ids = translation_pool.search(cr, uid, [('state', '=', 'to_translate'), ('gengo_translation', 'in', ('machine','standard','pro','ultra')), ('lang', 'in', langs)], limit=limit, context=context) if term_ids: - self._send_translation_terms(cr, uid, term_ids, context) - _logger.info("Translation terms %s has been posted to gengo successfully", len(term_ids)) + self._send_translation_terms(cr, uid, term_ids, context=context) + _logger.info("%s Translation terms have been posted to Gengo successfully", len(term_ids)) else: _logger.info('No Translation terms to process.') except Exception, e: diff --git a/addons/base_gengo/wizard/base_gengo_translation_view.xml b/addons/base_gengo/wizard/base_gengo_translation_view.xml new file mode 100644 index 00000000000..88ce7788d24 --- /dev/null +++ b/addons/base_gengo/wizard/base_gengo_translation_view.xml @@ -0,0 +1,39 @@ + + + + + base.gengo.translation.form + base.gengo.translations + +
+ + + + + + + + + +
+
+
+
+
+ + + Gengo: Manual Request of Translation + ir.actions.act_window + base.gengo.translations + form + form + new + + + +
+
diff --git a/addons/base_gengo/wizard/gengo_update_message.py b/addons/base_gengo/wizard/gengo_update_message.py deleted file mode 100644 index 45d54ffc54b..00000000000 --- a/addons/base_gengo/wizard/gengo_update_message.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- 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_memory): - """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 - - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From 7e7ed8ce1859e7a36a70c22eec15296ee9b6d433 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Thu, 30 Aug 2012 18:15:31 +0200 Subject: [PATCH 31/40] [FIX] google_docs: do not declare self = this as a GLOBAL variable bzr revid: qdp-launchpad@openerp.com-20120830161531-w0it8fda6a2j84vk --- addons/google_docs/static/src/js/gdocs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/google_docs/static/src/js/gdocs.js b/addons/google_docs/static/src/js/gdocs.js index 8f41a9d7b21..694f5736c72 100644 --- a/addons/google_docs/static/src/js/gdocs.js +++ b/addons/google_docs/static/src/js/gdocs.js @@ -3,7 +3,7 @@ var _t = instance.web._t; instance.web.Sidebar = instance.web.Sidebar.extend({ on_attachments_loaded: function(attachments) { - self = this + var self = this; self._super(attachments); // if attachment contains a google doc url do nothing // else display a button to create a google doc From 53049c846f47ad5ec6c283f00c1d092dab5ede60 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Thu, 30 Aug 2012 18:23:16 +0200 Subject: [PATCH 32/40] [IMP] base_gengo: commit finishing what did the previous one: removal of unused files and fields, fixing the cron job data, ... bzr revid: qdp-launchpad@openerp.com-20120830162316-vglsn7lfuxr04772 --- addons/base_gengo/__init__.py | 1 - addons/base_gengo/__openerp__.py | 2 +- .../base_gengo/gengo_sync_schedular_data.xml | 8 ++--- addons/base_gengo/res_company.py | 5 --- addons/base_gengo/res_company_view.xml | 1 - addons/base_gengo/res_lang.py | 31 ------------------- addons/base_gengo/res_lang_view.xml | 16 ---------- addons/base_gengo/wizard/__init__.py | 2 +- ...nslation.py => base_gengo_translations.py} | 0 ...w.xml => base_gengo_translations_view.xml} | 0 10 files changed, 6 insertions(+), 60 deletions(-) delete mode 100644 addons/base_gengo/res_lang.py delete mode 100644 addons/base_gengo/res_lang_view.xml rename addons/base_gengo/wizard/{base_gengo_translation.py => base_gengo_translations.py} (100%) rename addons/base_gengo/wizard/{base_gengo_translation_view.xml => base_gengo_translations_view.xml} (100%) diff --git a/addons/base_gengo/__init__.py b/addons/base_gengo/__init__.py index b4fd54acd21..133fa90dc51 100644 --- a/addons/base_gengo/__init__.py +++ b/addons/base_gengo/__init__.py @@ -22,6 +22,5 @@ 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 d2e5893d166..b60d3db9682 100644 --- a/addons/base_gengo/__openerp__.py +++ b/addons/base_gengo/__openerp__.py @@ -34,7 +34,7 @@ Automated Translations through Gengo API 'res_company_view.xml', 'res_lang_view.xml', - 'wizard/base_gengo_translation_view.xml', + 'wizard/base_gengo_translations_view.xml', ], 'demo_xml': [], 'test': [], diff --git a/addons/base_gengo/gengo_sync_schedular_data.xml b/addons/base_gengo/gengo_sync_schedular_data.xml index 78d2c602ac5..bd52a9697d3 100644 --- a/addons/base_gengo/gengo_sync_schedular_data.xml +++ b/addons/base_gengo/gengo_sync_schedular_data.xml @@ -4,11 +4,11 @@ Gengo Sync Translation (Response) - + 20 minutes -1 - + @@ -16,11 +16,11 @@ Gengo Sync Translation (Request) - + 20 minutes -1 - + diff --git a/addons/base_gengo/res_company.py b/addons/base_gengo/res_company.py index 610e46d05d2..22d7b343939 100644 --- a/addons/base_gengo/res_company.py +++ b/addons/base_gengo/res_company.py @@ -28,15 +28,10 @@ class res_company(osv.Model): _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 Type", required=True), "gengo_comment": fields.text("Comments", help="This comment will be automatically be enclosed in each an every request sent to Gengo"), "gengo_auto_approve": fields.boolean("Auto Approve Translation ?", help="Jobs are Automatically Approved by Gengo."), } _defaults = { - "gengo_tier": "machine", "gengo_auto_approve": True, } diff --git a/addons/base_gengo/res_company_view.xml b/addons/base_gengo/res_company_view.xml index fdc0c8833a6..0f99efc8ad0 100644 --- a/addons/base_gengo/res_company_view.xml +++ b/addons/base_gengo/res_company_view.xml @@ -18,7 +18,6 @@
- diff --git a/addons/base_gengo/res_lang.py b/addons/base_gengo/res_lang.py deleted file mode 100644 index 43b867c4f76..00000000000 --- a/addons/base_gengo/res_lang.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- 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" - _inherit = "res.lang" - - _columns = { - 'gengo_sync': fields.boolean('Gengo Auto Synchronize ?', help='If checked the language will be automatically synchronize translation periodically using gengo translation services.') - } diff --git a/addons/base_gengo/res_lang_view.xml b/addons/base_gengo/res_lang_view.xml deleted file mode 100644 index 38e6b995163..00000000000 --- a/addons/base_gengo/res_lang_view.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - res.lang.form.inherit - - res.lang - - - - - - - - diff --git a/addons/base_gengo/wizard/__init__.py b/addons/base_gengo/wizard/__init__.py index e3cd1565124..f5dd71be01c 100644 --- a/addons/base_gengo/wizard/__init__.py +++ b/addons/base_gengo/wizard/__init__.py @@ -19,6 +19,6 @@ # ############################################################################## -import base_gengo_translation +import base_gengo_translations # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_gengo/wizard/base_gengo_translation.py b/addons/base_gengo/wizard/base_gengo_translations.py similarity index 100% rename from addons/base_gengo/wizard/base_gengo_translation.py rename to addons/base_gengo/wizard/base_gengo_translations.py diff --git a/addons/base_gengo/wizard/base_gengo_translation_view.xml b/addons/base_gengo/wizard/base_gengo_translations_view.xml similarity index 100% rename from addons/base_gengo/wizard/base_gengo_translation_view.xml rename to addons/base_gengo/wizard/base_gengo_translations_view.xml From 7d96e13e2333ad1166aaf14fdea9073f02918d92 Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Fri, 31 Aug 2012 12:15:41 +0530 Subject: [PATCH 33/40] [FIX] Removed Unused File reference from __openerp__ and unneccesasry tier check on Do nto translate bzr revid: jam@tinyerp.com-20120831064541-1fd5h47xh8p7pb81 --- addons/base_gengo/__openerp__.py | 2 -- addons/base_gengo/ir_translation.py | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/base_gengo/__openerp__.py b/addons/base_gengo/__openerp__.py index b60d3db9682..89262afc457 100644 --- a/addons/base_gengo/__openerp__.py +++ b/addons/base_gengo/__openerp__.py @@ -32,8 +32,6 @@ Automated Translations through Gengo API 'update_xml': [ 'ir_translation.xml', 'res_company_view.xml', - 'res_lang_view.xml', - 'wizard/base_gengo_translations_view.xml', ], 'demo_xml': [], diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index 8f896ec561d..7a64c5ec305 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -79,6 +79,8 @@ class ir_translation(osv.Model): supported_langs = self._get_all_supported_languages(cr, uid, context=context) if supported_langs: for term in self.browse(cr, uid, ids, context=context): + if term.gengo_translation == "": + continue tier = "nonprofit" if term.gengo_translation == 'machine' else term.gengo_translation language = self._get_gengo_corresponding_language(term.lang) if tier not in supported_langs.get(language,[]): From 48b6fc09b3f2063a2a3febc8fabd4eca5f6885ca Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 31 Aug 2012 11:02:49 +0200 Subject: [PATCH 34/40] [FIX] base_gengo: removed required=True on gengo_translation field as the way to create translation is a bit unusual (created in a temporary table for mass import then using SQL queries to update the right table), it would be tricky to inherit at the right spot to apply the default value bzr revid: qdp-launchpad@openerp.com-20120831090249-v0meyp1luf29eddn --- addons/base_gengo/ir_translation.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index 7a64c5ec305..561938a28e1 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -48,15 +48,11 @@ class ir_translation(osv.Model): _inherit = "ir.translation" _columns = { 'gengo_comment': fields.text("Comments & Activity Linked to Gengo"), - 'job_id': fields.char('Gengo JobId', size=32), - "gengo_translation": fields.selection([('', 'Do not translate this term by Gengo'), - ('machine', 'Translation By Machine'), + 'job_id': fields.char('Gengo Job ID', size=32), + "gengo_translation": fields.selection([('machine', 'Translation By Machine'), ('standard', 'Standard'), ('pro', 'Pro'), - ('ultra', 'Ultra')], "Gengo Translation Service Level", help='You can select here the service level you want for an automatic translation using Gengo.', required=True), - } - _defaults = { - 'gengo_translation': '', + ('ultra', 'Ultra')], "Gengo Translation Service Level", help='You can select here the service level you want for an automatic translation using Gengo.'), } def _get_all_supported_languages(self, cr, uid, context=None): @@ -79,7 +75,7 @@ class ir_translation(osv.Model): supported_langs = self._get_all_supported_languages(cr, uid, context=context) if supported_langs: for term in self.browse(cr, uid, ids, context=context): - if term.gengo_translation == "": + if not term.gengo_translation: continue tier = "nonprofit" if term.gengo_translation == 'machine' else term.gengo_translation language = self._get_gengo_corresponding_language(term.lang) From 0491bffbe33151e95852f22b09031a3cf628564a Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 31 Aug 2012 11:18:51 +0200 Subject: [PATCH 35/40] [IMP] base_gengo: removal of restart_fetch_job field in wizard (not useful) bzr revid: qdp-launchpad@openerp.com-20120831091851-wq4wxw3h5mbc6wjw --- addons/base_gengo/wizard/base_gengo_translations.py | 4 +--- addons/base_gengo/wizard/base_gengo_translations_view.xml | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/addons/base_gengo/wizard/base_gengo_translations.py b/addons/base_gengo/wizard/base_gengo_translations.py index e91be00ec47..1e3637e7b56 100644 --- a/addons/base_gengo/wizard/base_gengo_translations.py +++ b/addons/base_gengo/wizard/base_gengo_translations.py @@ -48,7 +48,6 @@ class base_gengo_translations(osv.osv_memory): _name = 'base.gengo.translations' _columns = { 'restart_send_job': fields.boolean("Restart Sending Job"), - 'restart_fetch_job': fields.boolean("Restart Fetching Job"), 'lang_id': fields.many2one('res.lang', 'Language', help="Leave empty if you don't want to restrict the request to a single language"), } @@ -118,8 +117,7 @@ class base_gengo_translations(osv.osv_memory): #check the cron jobs and eventually restart/recreate them if wizard.restart_send_job: self.do_check_schedular(cr, uid, 'gengo_sync_send_request_scheduler', _('Gengo Sync Translation (Request)'), '_sync_request', context=context) - if wizard.restart_fetch_job: - self.do_check_schedular(cr, uid, 'gengo_sync_receive_request_scheduler', _('Gengo Sync Translation (Response)'), '_sync_response', context=context) + self.do_check_schedular(cr, uid, 'gengo_sync_receive_request_scheduler', _('Gengo Sync Translation (Response)'), '_sync_response', context=context) return {'type': 'ir.actions.act_window_close'} def _sync_response(self, cr, uid, limit=GENGO_DEFAULT_LIMIT, context=None): diff --git a/addons/base_gengo/wizard/base_gengo_translations_view.xml b/addons/base_gengo/wizard/base_gengo_translations_view.xml index 88ce7788d24..378d270f6aa 100644 --- a/addons/base_gengo/wizard/base_gengo_translations_view.xml +++ b/addons/base_gengo/wizard/base_gengo_translations_view.xml @@ -8,11 +8,10 @@
+ - - From 7c540602f543fc1c3c6a4969f1ee48e4bdecadae Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 31 Aug 2012 11:50:48 +0200 Subject: [PATCH 36/40] [FIX] base_gengo: added missing import statement bzr revid: qdp-launchpad@openerp.com-20120831095048-0yn1vgataftgadhx --- addons/base_gengo/ir_translation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index 561938a28e1..c7343159ddf 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -20,6 +20,7 @@ ############################################################################## from osv import fields, osv +from tools.translate import _ LANG_CODE_MAPPING = { 'ar_SA': ('ar', 'Arabic'), From 61a1ab40955a30cf15d50407900073537a93f47c Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 31 Aug 2012 11:53:12 +0200 Subject: [PATCH 37/40] [FIX] base_gengo: typo bzr revid: qdp-launchpad@openerp.com-20120831095312-pbi55dof1zrxzdsf --- addons/base_gengo/ir_translation.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base_gengo/ir_translation.xml b/addons/base_gengo/ir_translation.xml index 6725504df8a..ba9667d979e 100644 --- a/addons/base_gengo/ir_translation.xml +++ b/addons/base_gengo/ir_translation.xml @@ -21,7 +21,7 @@ - From ea60ca1e27cb469fca4fa9a33bc7bd59e1683088 Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Fri, 31 Aug 2012 15:31:43 +0530 Subject: [PATCH 38/40] [FIX] Usability Fix, missing import and added the resquest process call bzr revid: jam@tinyerp.com-20120831100143-rgx1ntdkzqcngov9 --- addons/base_gengo/wizard/base_gengo_translations.py | 1 + addons/base_gengo/wizard/base_gengo_translations_view.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/base_gengo/wizard/base_gengo_translations.py b/addons/base_gengo/wizard/base_gengo_translations.py index 1e3637e7b56..d8a96a2ced9 100644 --- a/addons/base_gengo/wizard/base_gengo_translations.py +++ b/addons/base_gengo/wizard/base_gengo_translations.py @@ -114,6 +114,7 @@ class base_gengo_translations(osv.osv_memory): ctx = context.copy() ctx['gengo_language'] = wizard.lang_id.id self._sync_request(cr, uid, limit=GENGO_DEFAULT_LIMIT, context=ctx) + self._sync_response( cr, uid, limit=GENGO_DEFAULT_LIMIT, context=ctx) #check the cron jobs and eventually restart/recreate them if wizard.restart_send_job: self.do_check_schedular(cr, uid, 'gengo_sync_send_request_scheduler', _('Gengo Sync Translation (Request)'), '_sync_request', context=context) diff --git a/addons/base_gengo/wizard/base_gengo_translations_view.xml b/addons/base_gengo/wizard/base_gengo_translations_view.xml index 378d270f6aa..09c3a77b1d5 100644 --- a/addons/base_gengo/wizard/base_gengo_translations_view.xml +++ b/addons/base_gengo/wizard/base_gengo_translations_view.xml @@ -8,7 +8,7 @@ - + From 422e3f1fbc6857e82a321fe75903aa11017b77dd Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Fri, 31 Aug 2012 16:25:40 +0530 Subject: [PATCH 39/40] [FIX] Set cron job to the false by default and module decrpation to use it. bzr revid: jam@tinyerp.com-20120831105540-hnt2zbx8fz8i6i01 --- addons/base_gengo/__openerp__.py | 7 +++++++ addons/base_gengo/gengo_sync_schedular_data.xml | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/addons/base_gengo/__openerp__.py b/addons/base_gengo/__openerp__.py index 89262afc457..1f002b3de43 100644 --- a/addons/base_gengo/__openerp__.py +++ b/addons/base_gengo/__openerp__.py @@ -24,6 +24,13 @@ 'category': 'Tools', 'description': """ Automated Translations through Gengo API +---------------------------------------- + The module will install passive Scheduler job for Automated Translations +using Gnego API. To active translation Configure your gengo authentication +parameters under `Settings > Companies > Gengo Parameters1 and Launch the +Gengo Language Sync Wizard under `Settings > Application Terms > +Gengo: Manual Request of Translation` and follow the wizard. This wizard will +active the Scheduler and will start active translation via Gengo Services, """, 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', diff --git a/addons/base_gengo/gengo_sync_schedular_data.xml b/addons/base_gengo/gengo_sync_schedular_data.xml index bd52a9697d3..823ca8f14db 100644 --- a/addons/base_gengo/gengo_sync_schedular_data.xml +++ b/addons/base_gengo/gengo_sync_schedular_data.xml @@ -4,7 +4,7 @@ Gengo Sync Translation (Response) - + 20 minutes -1 @@ -16,7 +16,7 @@ Gengo Sync Translation (Request) - + 20 minutes -1 From decd215edcbe6a30841780861c7b1e47be09c3b5 Mon Sep 17 00:00:00 2001 From: Jigar Amin - OpenERP Date: Fri, 31 Aug 2012 17:11:06 +0530 Subject: [PATCH 40/40] [FIX] _check_lang_support constrain bzr revid: jam@tinyerp.com-20120831114106-tjnrcwj4nslaamxz --- addons/base_gengo/ir_translation.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/addons/base_gengo/ir_translation.py b/addons/base_gengo/ir_translation.py index c7343159ddf..7b864aba8ce 100644 --- a/addons/base_gengo/ir_translation.py +++ b/addons/base_gengo/ir_translation.py @@ -73,15 +73,14 @@ class ir_translation(osv.Model): return lang in LANG_CODE_MAPPING and LANG_CODE_MAPPING[lang][0] or lang def _check_lang_support(self, cr, uid, ids, context=None): - supported_langs = self._get_all_supported_languages(cr, uid, context=context) - if supported_langs: - for term in self.browse(cr, uid, ids, context=context): - if not term.gengo_translation: - continue - tier = "nonprofit" if term.gengo_translation == 'machine' else term.gengo_translation - language = self._get_gengo_corresponding_language(term.lang) - if tier not in supported_langs.get(language,[]): - return False + for term in self.browse(cr, uid, ids, context=context): + if term.gengo_translation: + supported_langs = self._get_all_supported_languages(cr, uid, context=context) + if supported_langs: + tier = "nonprofit" if term.gengo_translation == 'machine' else term.gengo_translation + language = self._get_gengo_corresponding_language(term.lang) + if tier not in supported_langs.get(language,[]): + return False return True _constraints = [