From 83aca6da0064a54e59a104afb3200bb169daaaf2 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Tue, 29 Mar 2011 12:38:22 +0530 Subject: [PATCH 1/4] [IMP] sync_google_contact: Improved updating records based on last modified date/time of a google contact while importing. bzr revid: uco@tinyerp.com-20110329070822-d2ffzvl4cirdg0j3 --- addons/sync_google_contact/__openerp__.py | 1 + .../sync_google_contact.py | 4 ++ .../sync_google_contact_view.xml | 21 ++++++++ .../wizard/google_contact_import.py | 51 ++++++++++++++----- 4 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 addons/sync_google_contact/sync_google_contact_view.xml diff --git a/addons/sync_google_contact/__openerp__.py b/addons/sync_google_contact/__openerp__.py index 6d19f2c6865..5612542dfe5 100644 --- a/addons/sync_google_contact/__openerp__.py +++ b/addons/sync_google_contact/__openerp__.py @@ -30,6 +30,7 @@ 'depends': ['base','google_base_account'], 'init_xml': [], 'update_xml': [ + 'sync_google_contact_view.xml', 'wizard/google_contact_import_view.xml' ], 'demo_xml': [], diff --git a/addons/sync_google_contact/sync_google_contact.py b/addons/sync_google_contact/sync_google_contact.py index 9e7e3f49126..29fa4bfab43 100644 --- a/addons/sync_google_contact/sync_google_contact.py +++ b/addons/sync_google_contact/sync_google_contact.py @@ -24,6 +24,10 @@ from osv import fields,osv,orm class res_partner_address(osv.osv): _inherit = "res.partner.address" + _columns = { + 'last_modification_date': fields.datetime('Last Modification Date', readonly=True, help="Last modification date of google contact."), + } + def unlink(self, cr, uid, ids, context=None): model_obj = self.pool.get('ir.model.data') model_ids = model_obj.search(cr, uid, [('res_id','in',ids),('model','=','res.partner.address'),('module','=','sync_google_contact')], context=context) diff --git a/addons/sync_google_contact/sync_google_contact_view.xml b/addons/sync_google_contact/sync_google_contact_view.xml new file mode 100644 index 00000000000..d250e7f483e --- /dev/null +++ b/addons/sync_google_contact/sync_google_contact_view.xml @@ -0,0 +1,21 @@ + + + + + + res.partner.google.form + form + res.partner.address + + + + + + + + + + + + + \ No newline at end of file diff --git a/addons/sync_google_contact/wizard/google_contact_import.py b/addons/sync_google_contact/wizard/google_contact_import.py index d482a256515..abd7c446638 100644 --- a/addons/sync_google_contact/wizard/google_contact_import.py +++ b/addons/sync_google_contact/wizard/google_contact_import.py @@ -18,10 +18,14 @@ # along with this program. If not, see . # ############################################################################## +import time +import datetime +import dateutil +from dateutil.tz import * +from dateutil.parser import * +from pytz import timezone +import pytz -from osv import fields,osv -from tools.translate import _ -import tools try: import gdata import gdata.contacts.service @@ -29,6 +33,10 @@ try: except ImportError: raise osv.except_osv(_('Google Contacts Import Error!'), _('Please install gdata-python-client from http://code.google.com/p/gdata-python-client/downloads/list')) +from osv import fields,osv +from tools.translate import _ +import tools + class google_contact_import(osv.osv_memory): _inherit = 'google.login' _name = 'google.login.contact' @@ -138,9 +146,10 @@ class synchronize_google_contact(osv.osv_memory): addresses = [] partner_ids = [] contact_ids=[] + while contact: for entry in contact.entry: - data = self._retreive_data(entry) + data = self._retreive_data(entry, context=context) google_id = data.pop('id') model_data = { 'name': google_id, @@ -152,6 +161,9 @@ class synchronize_google_contact(osv.osv_memory): data_ids = model_obj.search(cr, uid, [('model','=','res.partner.address'), ('name','=', google_id)]) if data_ids: contact_ids = [model_obj.browse(cr, uid, data_ids[0], context=context).res_id] + address = addresss_obj.browse(cr, uid, contact_ids[0], context=context) + if address.last_modification_date > data.get('last_modification_date'): + data['last_modification_date'] = address.last_modification_date elif data['email']: contact_ids = addresss_obj.search(cr, uid, [('email', 'ilike', data['email'])]) @@ -183,7 +195,7 @@ class synchronize_google_contact(osv.osv_memory): else: return addresses - def _retreive_data(self, entry): + def _retreive_data(self, entry, context=None): data = {} data['id'] = entry.id.text name = tools.ustr(entry.title.text) @@ -192,7 +204,19 @@ class synchronize_google_contact(osv.osv_memory): data['name'] = name emails = ','.join(email.address for email in entry.email) data['email'] = emails - + + if 'tz' in context and context['tz']: + time_zone = context['tz'] + else: + time_zone = 'Asia/Kolkata' + au_tz = timezone(time_zone) + + if entry.updated: + google_updated = entry.updated.text + utime = dateutil.parser.parse(google_updated) + au_dt = au_tz.normalize(utime.astimezone(au_tz)) + updated_dt = datetime.datetime(*au_dt.timetuple()[:6]).strftime('%Y-%m-%d %H:%M:%S') + data['last_modification_date'] = updated_dt if entry.phone_number: for phone in entry.phone_number: @@ -211,17 +235,18 @@ class synchronize_google_contact(osv.osv_memory): name = str((addr.name or addr.partner_id and addr.partner_id.name or '').encode('utf-8')) if not name: - vals['name']=data.get('name','') + vals['name'] = data.get('name','') if not addr.email: - vals['email']=data.get('email','') + vals['email'] = data.get('email','') if not addr.mobile: - vals['mobile']=data.get('mobile','') + vals['mobile'] = data.get('mobile','') if not addr.phone: - vals['phone']=data.get('phone','') + vals['phone'] = data.get('phone','') if not addr.fax: - vals['fax']=data.get('fax','') - - addresss_obj.write(cr,uid,contact_ids,vals,context=context) + vals['fax'] = data.get('fax','') + vals['last_modification_date'] = data.get('last_modification_date') + + addresss_obj.write(cr, uid, contact_ids, vals, context=context) return {'type': 'ir.actions.act_window_close'} synchronize_google_contact() From 51eb931727cfc301bb0d32afdbbc1f0b20aec415 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Tue, 29 Mar 2011 15:36:41 +0530 Subject: [PATCH 2/4] [REF] sync_google_contact: Refactored the changes of adding timestamp checking. bzr revid: uco@tinyerp.com-20110329100641-gmle34qvuk18s87z --- addons/sync_google_contact/__openerp__.py | 1 - .../sync_google_contact.py | 4 +- .../sync_google_contact_view.xml | 21 ----------- .../wizard/google_contact_import.py | 37 +++++++------------ 4 files changed, 16 insertions(+), 47 deletions(-) delete mode 100644 addons/sync_google_contact/sync_google_contact_view.xml diff --git a/addons/sync_google_contact/__openerp__.py b/addons/sync_google_contact/__openerp__.py index 5612542dfe5..6d19f2c6865 100644 --- a/addons/sync_google_contact/__openerp__.py +++ b/addons/sync_google_contact/__openerp__.py @@ -30,7 +30,6 @@ 'depends': ['base','google_base_account'], 'init_xml': [], 'update_xml': [ - 'sync_google_contact_view.xml', 'wizard/google_contact_import_view.xml' ], 'demo_xml': [], diff --git a/addons/sync_google_contact/sync_google_contact.py b/addons/sync_google_contact/sync_google_contact.py index 29fa4bfab43..1c00a67cd52 100644 --- a/addons/sync_google_contact/sync_google_contact.py +++ b/addons/sync_google_contact/sync_google_contact.py @@ -19,13 +19,13 @@ # ############################################################################## -from osv import fields,osv,orm +from osv import fields,osv class res_partner_address(osv.osv): _inherit = "res.partner.address" _columns = { - 'last_modification_date': fields.datetime('Last Modification Date', readonly=True, help="Last modification date of google contact."), + 'write_date': fields.datetime('Date Modified', readonly=True, help="Modification date and time of address."), } def unlink(self, cr, uid, ids, context=None): diff --git a/addons/sync_google_contact/sync_google_contact_view.xml b/addons/sync_google_contact/sync_google_contact_view.xml deleted file mode 100644 index d250e7f483e..00000000000 --- a/addons/sync_google_contact/sync_google_contact_view.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - res.partner.google.form - form - res.partner.address - - - - - - - - - - - - - \ No newline at end of file diff --git a/addons/sync_google_contact/wizard/google_contact_import.py b/addons/sync_google_contact/wizard/google_contact_import.py index abd7c446638..e6642730f0d 100644 --- a/addons/sync_google_contact/wizard/google_contact_import.py +++ b/addons/sync_google_contact/wizard/google_contact_import.py @@ -18,13 +18,10 @@ # along with this program. If not, see . # ############################################################################## -import time import datetime import dateutil -from dateutil.tz import * from dateutil.parser import * from pytz import timezone -import pytz try: import gdata @@ -146,10 +143,15 @@ class synchronize_google_contact(osv.osv_memory): addresses = [] partner_ids = [] contact_ids=[] + if 'tz' in context and context['tz']: + time_zone = context['tz'] + else: + time_zone = 'Asia/Kolkata' + au_tz = timezone(time_zone) while contact: for entry in contact.entry: - data = self._retreive_data(entry, context=context) + data = self._retreive_data(entry) google_id = data.pop('id') model_data = { 'name': google_id, @@ -161,15 +163,18 @@ class synchronize_google_contact(osv.osv_memory): data_ids = model_obj.search(cr, uid, [('model','=','res.partner.address'), ('name','=', google_id)]) if data_ids: contact_ids = [model_obj.browse(cr, uid, data_ids[0], context=context).res_id] - address = addresss_obj.browse(cr, uid, contact_ids[0], context=context) - if address.last_modification_date > data.get('last_modification_date'): - data['last_modification_date'] = address.last_modification_date elif data['email']: contact_ids = addresss_obj.search(cr, uid, [('email', 'ilike', data['email'])]) if contact_ids: addresses.append(contact_ids[0]) - self.update_contact(cr, uid, contact_ids, data, context=context) + address = addresss_obj.browse(cr, uid, contact_ids[0], context=context) + google_updated = entry.updated.text + utime = dateutil.parser.parse(google_updated) + au_dt = au_tz.normalize(utime.astimezone(au_tz)) + updated_dt = datetime.datetime(*au_dt.timetuple()[:6]).strftime('%Y-%m-%d %H:%M:%S') + if address.write_date < updated_dt: + self.update_contact(cr, uid, contact_ids, data, context=context) res_id = contact_ids[0] if not contact_ids: #create or link to an existing partner only if it's a new contact @@ -195,7 +200,7 @@ class synchronize_google_contact(osv.osv_memory): else: return addresses - def _retreive_data(self, entry, context=None): + def _retreive_data(self, entry): data = {} data['id'] = entry.id.text name = tools.ustr(entry.title.text) @@ -205,19 +210,6 @@ class synchronize_google_contact(osv.osv_memory): emails = ','.join(email.address for email in entry.email) data['email'] = emails - if 'tz' in context and context['tz']: - time_zone = context['tz'] - else: - time_zone = 'Asia/Kolkata' - au_tz = timezone(time_zone) - - if entry.updated: - google_updated = entry.updated.text - utime = dateutil.parser.parse(google_updated) - au_dt = au_tz.normalize(utime.astimezone(au_tz)) - updated_dt = datetime.datetime(*au_dt.timetuple()[:6]).strftime('%Y-%m-%d %H:%M:%S') - data['last_modification_date'] = updated_dt - if entry.phone_number: for phone in entry.phone_number: if phone.rel == gdata.contacts.REL_WORK: @@ -244,7 +236,6 @@ class synchronize_google_contact(osv.osv_memory): vals['phone'] = data.get('phone','') if not addr.fax: vals['fax'] = data.get('fax','') - vals['last_modification_date'] = data.get('last_modification_date') addresss_obj.write(cr, uid, contact_ids, vals, context=context) return {'type': 'ir.actions.act_window_close'} From 8b114a48a2821763626f55920fd155f884f122d9 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Thu, 31 Mar 2011 12:20:47 +0530 Subject: [PATCH 3/4] [REF] sync_google_contact: Search for system's timezone if not specified on server. bzr revid: uco@tinyerp.com-20110331065047-0e8o74zf9ue2p731 --- .../wizard/google_contact_import.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/addons/sync_google_contact/wizard/google_contact_import.py b/addons/sync_google_contact/wizard/google_contact_import.py index e6642730f0d..2a9d36f3f0e 100644 --- a/addons/sync_google_contact/wizard/google_contact_import.py +++ b/addons/sync_google_contact/wizard/google_contact_import.py @@ -22,6 +22,7 @@ import datetime import dateutil from dateutil.parser import * from pytz import timezone +import os try: import gdata @@ -137,6 +138,16 @@ class synchronize_google_contact(osv.osv_memory): 'type': 'ir.actions.act_window', } + def _get_system_timezone(self): + sys_time_zone = False + if (os.path.exists("/etc/timezone")): + try: + f = open("/etc/timezone") + sys_time_zone = f.read().strip() + except: + f.close() + return sys_time_zone + def create_contact(self, cr, uid, ids, gd_client, contact, option,context=None): model_obj = self.pool.get('ir.model.data') addresss_obj = self.pool.get('res.partner.address') @@ -146,7 +157,7 @@ class synchronize_google_contact(osv.osv_memory): if 'tz' in context and context['tz']: time_zone = context['tz'] else: - time_zone = 'Asia/Kolkata' + time_zone = self._get_system_timezone() au_tz = timezone(time_zone) while contact: From 23f14aecb0c21b49b1818b3a65784d2371c77b5d Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Thu, 31 Mar 2011 18:38:09 +0530 Subject: [PATCH 4/4] [FIX] sync_google_contact: Fetching of timezone should not depend on system. bzr revid: uco@tinyerp.com-20110331130809-5autzqx8ubzh11he --- .../wizard/google_contact_import.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/addons/sync_google_contact/wizard/google_contact_import.py b/addons/sync_google_contact/wizard/google_contact_import.py index 2a9d36f3f0e..4175c635497 100644 --- a/addons/sync_google_contact/wizard/google_contact_import.py +++ b/addons/sync_google_contact/wizard/google_contact_import.py @@ -138,26 +138,16 @@ class synchronize_google_contact(osv.osv_memory): 'type': 'ir.actions.act_window', } - def _get_system_timezone(self): - sys_time_zone = False - if (os.path.exists("/etc/timezone")): - try: - f = open("/etc/timezone") - sys_time_zone = f.read().strip() - except: - f.close() - return sys_time_zone - def create_contact(self, cr, uid, ids, gd_client, contact, option,context=None): model_obj = self.pool.get('ir.model.data') addresss_obj = self.pool.get('res.partner.address') addresses = [] partner_ids = [] - contact_ids=[] + contact_ids = [] if 'tz' in context and context['tz']: time_zone = context['tz'] else: - time_zone = self._get_system_timezone() + time_zone = tools.get_server_timezone() au_tz = timezone(time_zone) while contact: