Просмотр исходного кода

Squashed 'google_api/' changes from ec54c81..7ca13b0

7ca13b0 fix: mejorar robustez de renovación de tokens Google API - doble intento con delay, mejor validación de autenticación, limpieza inteligente de tokens inválidos

git-subtree-dir: google_api
git-subtree-split: 7ca13b0cca11d03a6e1653dd0a54a630233405c4
root 5 месяцев назад
Родитель
Сommit
5889982e6b
1 измененных файлов с 38 добавлено и 3 удалено
  1. 38 3
      models/res_users_settings.py

+ 38 - 3
models/res_users_settings.py

@@ -51,7 +51,8 @@ class ResUsersSettings(models.Model):
     def _google_authenticated(self):
     def _google_authenticated(self):
         """Check if user is authenticated with Google"""
         """Check if user is authenticated with Google"""
         self.ensure_one()
         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):
     def _is_google_token_valid(self):
         """Check if Google token is still valid"""
         """Check if Google token is still valid"""
@@ -93,11 +94,45 @@ class ResUsersSettings(models.Model):
         if not self._google_authenticated():
         if not self._google_authenticated():
             return None
             return None
         
         
+        # Si el token no es válido, intentar renovarlo
         if not self._is_google_token_valid():
         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():
             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):
     def action_connect_google(self):
         """Connect user's Google account"""
         """Connect user's Google account"""