Эх сурвалжийг харах

Merge commit 'ee2887b5fa84e93a2abd61db56c27433bf7b221a' into TC

root 5 сар өмнө
parent
commit
944cb48360

+ 48 - 10
google_api/models/res_users_settings.py

@@ -61,23 +61,61 @@ class ResUsersSettings(models.Model):
                 self.sudo().google_token_validity >= (fields.Datetime.now() + timedelta(minutes=1)))
 
     def _refresh_google_token(self):
-        """Refresh Google access token using refresh token"""
+        """Refresh Google access token using refresh token with custom credentials"""
         self.ensure_one()
 
         try:
-            access_token, ttl = self.env['google.service']._refresh_google_token('drive', self.sudo().google_rtoken)
-            self.sudo().write({
-                'google_token': access_token,
-                'google_token_validity': fields.Datetime.now() + timedelta(seconds=ttl),
-            })
-            _logger.info(f"Google token refreshed for user {self.user_id.name}")
-            return True
+            # Get Google API credentials from system settings
+            config = self.env['ir.config_parameter'].sudo()
+            client_id = config.get_param('google_api.client_id', '')
+            client_secret = config.get_param('google_api.client_secret', '')
+            refresh_token = self.sudo().google_rtoken
+
+            if not all([client_id, client_secret, refresh_token]):
+                _logger.error(f"Missing credentials for token refresh for user {self.user_id.name}")
+                return False
+
+            # Exchange refresh token for new access token using our custom credentials
+            import requests
+            
+            token_url = 'https://oauth2.googleapis.com/token'
+            data = {
+                'client_id': client_id,
+                'client_secret': client_secret,
+                'refresh_token': refresh_token,
+                'grant_type': 'refresh_token'
+            }
+
+            response = requests.post(token_url, data=data, timeout=30)
+
+            if response.status_code == 200:
+                token_data = response.json()
+                new_access_token = token_data.get('access_token')
+                expires_in = token_data.get('expires_in', 3600)
+
+                if new_access_token:
+                    # Calculate expiration time
+                    expires_at = fields.Datetime.now() + timedelta(seconds=expires_in)
+                    
+                    self.sudo().write({
+                        'google_token': new_access_token,
+                        'google_token_validity': expires_at,
+                    })
+                    _logger.info(f"Google token refreshed for user {self.user_id.name}")
+                    return True
+                else:
+                    _logger.error(f"No access token in response for user {self.user_id.name}")
+                    return False
+            else:
+                _logger.error(f"Token refresh failed for user {self.user_id.name}: {response.status_code} - {response.text}")
+                return False
+
         except Exception as e:
             _logger.error(f"Failed to refresh Google token for user {self.user_id.name}: {str(e)}")
             
             # Solo eliminar tokens si es definitivamente un error de credenciales inválidas
-            if 'invalid_grant' in str(e) or 'invalid_token' in str(e):
-                _logger.warning(f"Invalid refresh token for user {self.user_id.name}, deleting tokens")
+            if 'invalid_grant' in str(e) or 'invalid_token' in str(e) or 'invalid_client' in str(e):
+                _logger.warning(f"Invalid credentials for user {self.user_id.name}, deleting tokens")
                 self.env.cr.rollback()
                 self.sudo()._set_google_auth_tokens(False, False, False)
                 self.env.cr.commit()