|
|
@@ -51,7 +51,8 @@ class ResUsersSettings(models.Model):
|
|
|
def _google_authenticated(self):
|
|
|
"""Check if user is authenticated with Google"""
|
|
|
self.ensure_one()
|
|
|
- return bool(self.sudo().google_rtoken)
|
|
|
+ # Verificar que tenemos tanto refresh token como access token
|
|
|
+ return bool(self.sudo().google_rtoken and self.sudo().google_token)
|
|
|
|
|
|
def _is_google_token_valid(self):
|
|
|
"""Check if Google token is still valid"""
|
|
|
@@ -93,11 +94,45 @@ class ResUsersSettings(models.Model):
|
|
|
if not self._google_authenticated():
|
|
|
return None
|
|
|
|
|
|
+ # Si el token no es válido, intentar renovarlo
|
|
|
if not self._is_google_token_valid():
|
|
|
+ _logger.info(f"Token expired for user {self.user_id.name}, attempting refresh")
|
|
|
+
|
|
|
+ # Intentar renovar el token
|
|
|
if not self._refresh_google_token():
|
|
|
- return None
|
|
|
+ _logger.warning(f"Token refresh failed for user {self.user_id.name}")
|
|
|
+
|
|
|
+ # Si falla la renovación, verificar si aún tenemos refresh token
|
|
|
+ if not self.sudo().google_rtoken:
|
|
|
+ _logger.error(f"No refresh token available for user {self.user_id.name}")
|
|
|
+ return None
|
|
|
+
|
|
|
+ # Intentar una vez más con un pequeño delay
|
|
|
+ import time
|
|
|
+ time.sleep(1)
|
|
|
+ _logger.info(f"Retrying token refresh for user {self.user_id.name}")
|
|
|
+
|
|
|
+ if not self._refresh_google_token():
|
|
|
+ _logger.error(f"Final token refresh attempt failed for user {self.user_id.name}")
|
|
|
+ return None
|
|
|
|
|
|
- return self.sudo().google_token
|
|
|
+ # Verificar que tenemos un token válido
|
|
|
+ token = self.sudo().google_token
|
|
|
+ if not token:
|
|
|
+ _logger.warning(f"No access token available for user {self.user_id.name}")
|
|
|
+ return None
|
|
|
+
|
|
|
+ return token
|
|
|
+
|
|
|
+ def _clean_invalid_tokens(self):
|
|
|
+ """Clean invalid tokens when they can't be refreshed"""
|
|
|
+ self.ensure_one()
|
|
|
+ _logger.warning(f"Cleaning invalid tokens for user {self.user_id.name}")
|
|
|
+ self.sudo()._set_google_auth_tokens(False, False, False)
|
|
|
+ self.sudo().write({
|
|
|
+ 'google_email': False,
|
|
|
+ 'google_sync_enabled': False,
|
|
|
+ })
|
|
|
|
|
|
def action_connect_google(self):
|
|
|
"""Connect user's Google account"""
|