[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')
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:
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)
@ -116,7 +116,7 @@ class google_service(osv.osv_memory):
uri = self.get_uri_oauth(a='token')
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:
if e.code == 400: # invalid grant
registry = openerp.modules.registry.RegistryManager.get(request.session.db)
@ -129,7 +129,8 @@ class google_service(osv.osv_memory):
return res
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') """
_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()
response = simplejson.loads(content)
if context.get('ask_time'):
try:
date = datetime.strptime(request.headers.get('date'), "%a, %d %b %Y %H:%M:%S %Z")
except:
date = datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)
context['ask_time'] = date
try:
ask_time = datetime.strptime(request.headers.get('date'), "%a, %d %b %Y %H:%M:%S %Z")
except:
ask_time = datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)
except urllib2.HTTPError, e:
if e.code in (400, 401, 410):
raise e
_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)
return (status, response)
return (status, response, ask_time)
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)

View File

@ -277,7 +277,7 @@ class google_calendar(osv.AbstractModel):
url = "/calendar/v3/calendars/primary"
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:
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
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):
if not token:
@ -315,7 +315,7 @@ class google_calendar(osv.AbstractModel):
if 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 = {}
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)
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:
_logger.info("Calendar Synchro - In except of get_one_event_synchro")
pass
@ -357,7 +357,7 @@ class google_calendar(osv.AbstractModel):
data['sequence'] = google_event.get('sequence', 0)
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")
calendar_event.write(cr, uid, [oe_event.id], {'oe_update_date': update_date})
@ -372,7 +372,7 @@ class google_calendar(osv.AbstractModel):
headers = {}
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 ?
return response
@ -514,8 +514,7 @@ class google_calendar(osv.AbstractModel):
current_user = self.pool['res.users'].browse(cr, uid, uid, context=context)
context_with_time = dict(context.copy(), ask_time=True)
current_google = self.get_calendar_primary_id(cr, uid, context=context_with_time)
st, current_google, ask_time = self.get_calendar_primary_id(cr, uid, context=context)
if 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)
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 {
"status": res and "need_refresh" or "no_new_event_form_google",
"url": ''
@ -571,7 +570,7 @@ class google_calendar(osv.AbstractModel):
], context=context_norecurrent)
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:
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):
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})
@ -617,7 +616,7 @@ class google_calendar(osv.AbstractModel):
if new_google_internal_event_id:
#TODO WARNING, NEED TO CHECK THAT EVENT and ALL instance NOT DELETE IN GMAIL BEFORE !
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):
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)
@ -837,7 +836,7 @@ class google_calendar(osv.AbstractModel):
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)
#################################
## MANAGE CONNEXION TO GMAIL ##