Browse Source

fix: Improve error handling for Shared Drive access in Google Drive service

- Add Shared Drive parameters to navigate_folder_hierarchy method
- Improve error handling for 404 errors in folder navigation
- Add better error messages for folder structure analysis
- Handle cases where folders are not accessible or don't exist
- Improve find_folders_by_name method error handling
- Add warning messages instead of errors for inaccessible folders
root 5 tháng trước cách đây
mục cha
commit
b274c047de

+ 28 - 8
google_api/models/google_drive_service.py

@@ -364,9 +364,11 @@ class GoogleDriveService(models.AbstractModel):
             
             for level in range(max_levels):
                 try:
-                    response = self._do_request(f'/drive/v3/files/{current_id}', {
-                        'fields': 'id,name,parents'
-                    })
+                    # Use Shared Drive parameters to handle both regular and shared drive folders
+                    params = self._build_shared_drive_params()
+                    params['fields'] = 'id,name,parents'
+                    
+                    response = self._do_request(f'/drive/v3/files/{current_id}', params)
                     
                     folder_info = {
                         'id': response.get('id'),
@@ -382,8 +384,16 @@ class GoogleDriveService(models.AbstractModel):
                     
                     current_id = parent_ids[0]
                     
+                except UserError as e:
+                    # Handle 404 errors gracefully - folder might not exist or be accessible
+                    if '404' in str(e):
+                        _logger.warning(f"Folder {current_id} not found or not accessible at level {level}")
+                        break
+                    else:
+                        _logger.error(f"Error navigating folder hierarchy at level {level}: {str(e)}")
+                        break
                 except Exception as e:
-                    _logger.error(f"Error navigating folder hierarchy at level {level}: {str(e)}")
+                    _logger.error(f"Unexpected error navigating folder hierarchy at level {level}: {str(e)}")
                     break
             
             return hierarchy
@@ -417,8 +427,16 @@ class GoogleDriveService(models.AbstractModel):
             
             return matching_folders
             
+        except UserError as e:
+            # Handle access errors gracefully
+            if '404' in str(e) or '403' in str(e):
+                _logger.warning(f"Cannot access parent folder {parent_id}: {str(e)}")
+                return []
+            else:
+                _logger.error(f"Error finding folders by name: {str(e)}")
+                return []
         except Exception as e:
-            _logger.error(f"Error finding folders by name: {str(e)}")
+            _logger.error(f"Unexpected error finding folders by name: {str(e)}")
             return []
 
     def get_folder_info(self, folder_id):
@@ -428,9 +446,11 @@ class GoogleDriveService(models.AbstractModel):
             if not validation.get('valid'):
                 return None
             
-            response = self._do_request(f'/drive/v3/files/{folder_id}', {
-                'fields': 'id,name,parents,createdTime,modifiedTime,mimeType'
-            })
+            # Use Shared Drive parameters to handle both regular and shared drive folders
+            params = self._build_shared_drive_params()
+            params['fields'] = 'id,name,parents,createdTime,modifiedTime,mimeType'
+            
+            response = self._do_request(f'/drive/v3/files/{folder_id}', params)
             
             return response
             

+ 34 - 1
m22tc_google_workspace/models/crm_lead.py

@@ -579,6 +579,7 @@ class CrmLead(models.Model):
             
             validation = drive_service.validate_folder_id(folder_id)
             if not validation.get('valid'):
+                _logger.warning(f"Folder {folder_id} is not valid or accessible")
                 return None
             
             current_name = validation.get('name', '')
@@ -592,6 +593,11 @@ class CrmLead(models.Model):
             
             hierarchy = drive_service.navigate_folder_hierarchy(folder_id, max_levels=5)
             
+            # If hierarchy is empty, return basic structure with just the opportunity folder
+            if not hierarchy:
+                _logger.warning(f"Could not navigate hierarchy for folder {folder_id}")
+                return complete_structure
+            
             for folder_info in hierarchy:
                 folder_name = folder_info.get('name', '')
                 level = folder_info.get('level', 0)
@@ -764,7 +770,33 @@ class CrmLead(models.Model):
             current_structure = self._analyze_crm_folder_structure(self.google_drive_folder_id)
             
             if not current_structure:
-                raise UserError(_('Could not analyze current folder structure'))
+                # Provide a more helpful error message
+                error_msg = f"<strong>❌ Cannot Analyze Folder Structure</strong><br/><br/>"
+                error_msg += f"<strong>Folder ID:</strong> {self.google_drive_folder_id}<br/>"
+                error_msg += f"<strong>Possible Issues:</strong><br/>"
+                error_msg += f"• Folder may not exist or be accessible<br/>"
+                error_msg += f"• Insufficient permissions to access the folder<br/>"
+                error_msg += f"• Folder may be in a Shared Drive without proper access<br/>"
+                error_msg += f"• Network connectivity issues<br/><br/>"
+                error_msg += f"<strong>Expected Structure:</strong><br/>"
+                error_msg += f"📁 [Root Folder] (MC Team)<br/>"
+                error_msg += f"└── 📁 {expected_components['primary_name']} (Company/Contact)<br/>"
+                error_msg += f"    └── 📁 {expected_components['year']} (Year)<br/>"
+                error_msg += f"        └── 📁 {expected_components['opportunity_name']} (Opportunity)<br/>"
+                error_msg += f"            ├── 📁 Meets<br/>"
+                error_msg += f"            └── 📁 Archivos cliente<br/><br/>"
+                error_msg += f"<strong>Recommendation:</strong> Try using the 'Rename Folder Structure' button to recreate the structure."
+                
+                return {
+                    'type': 'ir.actions.client',
+                    'tag': 'display_notification',
+                    'params': {
+                        'title': _('Folder Structure Analysis'),
+                        'message': error_msg,
+                        'type': 'warning',
+                        'sticky': True,
+                    }
+                }
             
             analysis = self._compare_folder_structures(expected_components, current_structure)
             
@@ -779,6 +811,7 @@ class CrmLead(models.Model):
                 }
             }
         except Exception as e:
+            _logger.error(f"Error in action_analyze_folder_structure: {str(e)}")
             raise UserError(_('Failed to analyze folder structure: %s') % str(e))
 
     def _compare_folder_structures(self, expected_components, current_structure):