[FIX] google_{account|calendar}: fix synchro

- no more tracebacks when trying to sync more than once with Google Calendar
- no more context hacks, explicit return of `ask_time`.

(Closes #1588)
This commit is contained in:
cod-odoo 2014-08-05 14:29:02 +05:30 committed by Richard Mathot
parent 79570179bf
commit 4f3db3ec04
2 changed files with 20 additions and 22 deletions

View File

@ -92,7 +92,7 @@ class google_service(osv.osv_memory):
uri = self.get_uri_oauth(a='token') uri = self.get_uri_oauth(a='token')
data = werkzeug.url_encode(params) data = werkzeug.url_encode(params)
st, res = self._do_request(cr, uid, uri, params=data, headers=headers, type='POST', preuri='', context=context) st, res, ask_time = self._do_request(cr, uid, uri, params=data, headers=headers, type='POST', preuri='', context=context)
except urllib2.HTTPError: except urllib2.HTTPError:
error_msg = "Something went wrong during your token generation. Maybe your Authorization Code is invalid" error_msg = "Something went wrong during your token generation. Maybe your Authorization Code is invalid"
raise self.pool.get('res.config.settings').get_config_warning(cr, _(error_msg), context=context) raise self.pool.get('res.config.settings').get_config_warning(cr, _(error_msg), context=context)
@ -116,7 +116,7 @@ class google_service(osv.osv_memory):
uri = self.get_uri_oauth(a='token') uri = self.get_uri_oauth(a='token')
data = werkzeug.url_encode(params) data = werkzeug.url_encode(params)
st, res = self._do_request(cr, uid, uri, params=data, headers=headers, type='POST', preuri='', context=context) st, res, ask_time = self._do_request(cr, uid, uri, params=data, headers=headers, type='POST', preuri='', context=context)
except urllib2.HTTPError, e: except urllib2.HTTPError, e:
if e.code == 400: # invalid grant if e.code == 400: # invalid grant
registry = openerp.modules.registry.RegistryManager.get(request.session.db) registry = openerp.modules.registry.RegistryManager.get(request.session.db)
@ -129,7 +129,8 @@ class google_service(osv.osv_memory):
return res return res
def _do_request(self, cr, uid, uri, params={}, headers={}, type='POST', preuri="https://www.googleapis.com", context=None): def _do_request(self, cr, uid, uri, params={}, headers={}, type='POST', preuri="https://www.googleapis.com", context=None):
context = dict(context or {}) if context is None:
context = {}
""" Return a tuple ('HTTP_CODE', 'HTTP_RESPONSE') """ """ Return a tuple ('HTTP_CODE', 'HTTP_RESPONSE') """
_logger.debug("Uri: %s - Type : %s - Headers: %s - Params : %s !" % (uri, type, headers, werkzeug.url_encode(params) if type == 'GET' else params)) _logger.debug("Uri: %s - Type : %s - Headers: %s - Params : %s !" % (uri, type, headers, werkzeug.url_encode(params) if type == 'GET' else params))
@ -155,19 +156,17 @@ class google_service(osv.osv_memory):
content = request.read() content = request.read()
response = simplejson.loads(content) response = simplejson.loads(content)
if context.get('ask_time'): try:
try: ask_time = datetime.strptime(request.headers.get('date'), "%a, %d %b %Y %H:%M:%S %Z")
date = datetime.strptime(request.headers.get('date'), "%a, %d %b %Y %H:%M:%S %Z") except:
except: ask_time = datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)
date = datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)
context['ask_time'] = date
except urllib2.HTTPError, e: except urllib2.HTTPError, e:
if e.code in (400, 401, 410): if e.code in (400, 401, 410):
raise e raise e
_logger.exception("Bad google request : %s !" % e.read()) _logger.exception("Bad google request : %s !" % e.read())
raise self.pool.get('res.config.settings').get_config_warning(cr, _("Something went wrong with your request to google"), context=context) raise self.pool.get('res.config.settings').get_config_warning(cr, _("Something went wrong with your request to google"), context=context)
return (status, response) return (status, response, ask_time)
def get_base_url(self, cr, uid, context=None): def get_base_url(self, cr, uid, context=None):
return self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', default='http://www.openerp.com?NoBaseUrl', context=context) return self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', default='http://www.openerp.com?NoBaseUrl', context=context)

View File

@ -277,7 +277,7 @@ class google_calendar(osv.AbstractModel):
url = "/calendar/v3/calendars/primary" url = "/calendar/v3/calendars/primary"
try: try:
st, content = self.pool['google.service']._do_request(cr, uid, url, params, headers, type='GET', context=context) st, content, ask_time = self.pool['google.service']._do_request(cr, uid, url, params, headers, type='GET', context=context)
except Exception, e: except Exception, e:
if (e.code == 401): # Token invalid / Acces unauthorized if (e.code == 401): # Token invalid / Acces unauthorized
@ -290,7 +290,7 @@ class google_calendar(osv.AbstractModel):
raise self.pool.get('res.config.settings').get_config_warning(cr, _(error_msg), context=context) raise self.pool.get('res.config.settings').get_config_warning(cr, _(error_msg), context=context)
raise raise
return status_response(st) and content['id'] or False return (status_response(st), content['id'] or False, ask_time)
def get_event_synchro_dict(self, cr, uid, lastSync=False, token=False, nextPageToken=False, context=None): def get_event_synchro_dict(self, cr, uid, lastSync=False, token=False, nextPageToken=False, context=None):
if not token: if not token:
@ -315,7 +315,7 @@ class google_calendar(osv.AbstractModel):
if nextPageToken: if nextPageToken:
params['pageToken'] = nextPageToken params['pageToken'] = nextPageToken
status, content = self.pool['google.service']._do_request(cr, uid, url, params, headers, type='GET', context=context) status, content, ask_time = self.pool['google.service']._do_request(cr, uid, url, params, headers, type='GET', context=context)
google_events_dict = {} google_events_dict = {}
for google_event in content['items']: for google_event in content['items']:
@ -341,7 +341,7 @@ class google_calendar(osv.AbstractModel):
url = "/calendar/v3/calendars/%s/events/%s" % ('primary', google_id) url = "/calendar/v3/calendars/%s/events/%s" % ('primary', google_id)
try: try:
status, content = self.pool['google.service']._do_request(cr, uid, url, params, headers, type='GET', context=context) status, content, ask_time = self.pool['google.service']._do_request(cr, uid, url, params, headers, type='GET', context=context)
except: except:
_logger.info("Calendar Synchro - In except of get_one_event_synchro") _logger.info("Calendar Synchro - In except of get_one_event_synchro")
pass pass
@ -357,7 +357,7 @@ class google_calendar(osv.AbstractModel):
data['sequence'] = google_event.get('sequence', 0) data['sequence'] = google_event.get('sequence', 0)
data_json = simplejson.dumps(data) data_json = simplejson.dumps(data)
status, content = self.pool['google.service']._do_request(cr, uid, url, data_json, headers, type='PATCH', context=context) status, content, ask_time = self.pool['google.service']._do_request(cr, uid, url, data_json, headers, type='PATCH', context=context)
update_date = datetime.strptime(content['updated'], "%Y-%m-%dT%H:%M:%S.%fz") update_date = datetime.strptime(content['updated'], "%Y-%m-%dT%H:%M:%S.%fz")
calendar_event.write(cr, uid, [oe_event.id], {'oe_update_date': update_date}) calendar_event.write(cr, uid, [oe_event.id], {'oe_update_date': update_date})
@ -372,7 +372,7 @@ class google_calendar(osv.AbstractModel):
headers = {} headers = {}
data['access_token'] = self.get_token(cr, uid, context) data['access_token'] = self.get_token(cr, uid, context)
status, response = self.pool['google.service']._do_request(cr, uid, url, data, headers, type='GET', context=context) status, response, ask_time = self.pool['google.service']._do_request(cr, uid, url, data, headers, type='GET', context=context)
#TO_CHECK : , if http fail, no event, do DELETE ? #TO_CHECK : , if http fail, no event, do DELETE ?
return response return response
@ -514,8 +514,7 @@ class google_calendar(osv.AbstractModel):
current_user = self.pool['res.users'].browse(cr, uid, uid, context=context) current_user = self.pool['res.users'].browse(cr, uid, uid, context=context)
context_with_time = dict(context.copy(), ask_time=True) st, current_google, ask_time = self.get_calendar_primary_id(cr, uid, context=context)
current_google = self.get_calendar_primary_id(cr, uid, context=context_with_time)
if current_user.google_calendar_cal_id: if current_user.google_calendar_cal_id:
if current_google != current_user.google_calendar_cal_id: if current_google != current_user.google_calendar_cal_id:
@ -545,7 +544,7 @@ class google_calendar(osv.AbstractModel):
res = self.update_events(cr, uid, lastSync, context) res = self.update_events(cr, uid, lastSync, context)
current_user.write({'google_calendar_last_sync_date': context_with_time.get('ask_time')}, context=context) current_user.write({'google_calendar_last_sync_date': ask_time}, context=context)
return { return {
"status": res and "need_refresh" or "no_new_event_form_google", "status": res and "need_refresh" or "no_new_event_form_google",
"url": '' "url": ''
@ -571,7 +570,7 @@ class google_calendar(osv.AbstractModel):
], context=context_norecurrent) ], context=context_norecurrent)
for att in att_obj.browse(cr, uid, my_att_ids, context=context): for att in att_obj.browse(cr, uid, my_att_ids, context=context):
if not att.event_id.recurrent_id or att.event_id.recurrent_id == 0: if not att.event_id.recurrent_id or att.event_id.recurrent_id == 0:
st, response = self.create_an_event(cr, uid, att.event_id, context=context) st, response, ask_time = self.create_an_event(cr, uid, att.event_id, context=context)
if status_response(st): if status_response(st):
update_date = datetime.strptime(response['updated'], "%Y-%m-%dT%H:%M:%S.%fz") update_date = datetime.strptime(response['updated'], "%Y-%m-%dT%H:%M:%S.%fz")
ev_obj.write(cr, uid, att.event_id.id, {'oe_update_date': update_date}) ev_obj.write(cr, uid, att.event_id.id, {'oe_update_date': update_date})
@ -617,7 +616,7 @@ class google_calendar(osv.AbstractModel):
if new_google_internal_event_id: if new_google_internal_event_id:
#TODO WARNING, NEED TO CHECK THAT EVENT and ALL instance NOT DELETE IN GMAIL BEFORE ! #TODO WARNING, NEED TO CHECK THAT EVENT and ALL instance NOT DELETE IN GMAIL BEFORE !
try: try:
st, response = self.update_recurrent_event_exclu(cr, uid, new_google_internal_event_id, source_attendee_record.google_internal_event_id, att.event_id, context=context) st, response, ask_time = self.update_recurrent_event_exclu(cr, uid, new_google_internal_event_id, source_attendee_record.google_internal_event_id, att.event_id, context=context)
if status_response(st): if status_response(st):
att_obj.write(cr, uid, [att.id], {'google_internal_event_id': new_google_internal_event_id}, context=context) att_obj.write(cr, uid, [att.id], {'google_internal_event_id': new_google_internal_event_id}, context=context)
new_ids.append(new_google_internal_event_id) new_ids.append(new_google_internal_event_id)
@ -837,7 +836,7 @@ class google_calendar(osv.AbstractModel):
url = "/calendar/v3/calendars/%s/events/%s" % ('primary', instance_id) url = "/calendar/v3/calendars/%s/events/%s" % ('primary', instance_id)
st, content = gs_pool._do_request(cr, uid, url, params, headers, type='GET', context=context) st, content, ask_time = gs_pool._do_request(cr, uid, url, params, headers, type='GET', context=context)
return content.get('sequence', 0) return content.get('sequence', 0)
################################# #################################
## MANAGE CONNEXION TO GMAIL ## ## MANAGE CONNEXION TO GMAIL ##