google_workspace_service.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. # -*- coding: utf-8 -*-
  2. import logging
  3. from odoo import models, api
  4. from odoo.exceptions import UserError
  5. from odoo.tools.translate import _
  6. _logger = logging.getLogger(__name__)
  7. class GoogleWorkspaceService(models.AbstractModel):
  8. _name = 'google.workspace.service'
  9. _description = 'Google Workspace Service'
  10. def list_shared_drives(self):
  11. """List all accessible Shared Drives"""
  12. try:
  13. drive_service = self.env['google.drive.service']
  14. # Use the drive service to make the request
  15. response = drive_service._do_request('/drive/v3/drives', {
  16. 'pageSize': 100,
  17. 'fields': 'drives(id,name,createdTime,capabilities)'
  18. })
  19. shared_drives = response.get('drives', [])
  20. return {
  21. 'success': True,
  22. 'shared_drives': shared_drives
  23. }
  24. except Exception as e:
  25. _logger.error(f"Error listing shared drives: {str(e)}")
  26. return {
  27. 'success': False,
  28. 'error': str(e)
  29. }
  30. def get_shared_drive_info(self, drive_id):
  31. """Get information about a specific Shared Drive"""
  32. try:
  33. drive_service = self.env['google.drive.service']
  34. response = drive_service._do_request(f'/drive/v3/drives/{drive_id}', {
  35. 'fields': 'id,name,createdTime,capabilities,restrictions'
  36. })
  37. return {
  38. 'success': True,
  39. 'drive_info': response
  40. }
  41. except Exception as e:
  42. _logger.error(f"Error getting shared drive info: {str(e)}")
  43. return {
  44. 'success': False,
  45. 'error': str(e)
  46. }
  47. def list_files_in_shared_drive(self, drive_id, folder_id=None):
  48. """List files in a Shared Drive or specific folder within it"""
  49. try:
  50. drive_service = self.env['google.drive.service']
  51. # Build query
  52. query = f"'{drive_id}' in parents and trashed=false"
  53. if folder_id:
  54. query = f"'{folder_id}' in parents and trashed=false"
  55. params = {
  56. 'q': query,
  57. 'fields': 'files(id,name,mimeType,createdTime,modifiedTime,parents)',
  58. 'pageSize': 100,
  59. 'orderBy': 'name'
  60. }
  61. # Add Shared Drive parameters
  62. params.update(drive_service._build_shared_drive_params())
  63. response = drive_service._do_request('/drive/v3/files', params)
  64. return {
  65. 'success': True,
  66. 'files': response.get('files', [])
  67. }
  68. except Exception as e:
  69. _logger.error(f"Error listing files in shared drive: {str(e)}")
  70. return {
  71. 'success': False,
  72. 'error': str(e)
  73. }
  74. def check_shared_drive_permissions(self, drive_id):
  75. """Check current user's permissions on a Shared Drive"""
  76. try:
  77. drive_service = self.env['google.drive.service']
  78. # Get drive info with capabilities
  79. response = drive_service._do_request(f'/drive/v3/drives/{drive_id}', {
  80. 'fields': 'capabilities'
  81. })
  82. capabilities = response.get('capabilities', {})
  83. permissions = {
  84. 'can_add_children': capabilities.get('canAddChildren', False),
  85. 'can_comment': capabilities.get('canComment', False),
  86. 'can_copy': capabilities.get('canCopy', False),
  87. 'can_delete': capabilities.get('canDelete', False),
  88. 'can_download': capabilities.get('canDownload', False),
  89. 'can_edit': capabilities.get('canEdit', False),
  90. 'can_list_children': capabilities.get('canListChildren', False),
  91. 'can_move_item_into_team_drive': capabilities.get('canMoveItemIntoTeamDrive', False),
  92. 'can_move_item_out_of_team_drive': capabilities.get('canMoveItemOutOfTeamDrive', False),
  93. 'can_move_item_within_team_drive': capabilities.get('canMoveItemWithinTeamDrive', False),
  94. 'can_read': capabilities.get('canRead', False),
  95. 'can_read_revisions': capabilities.get('canReadRevisions', False),
  96. 'can_remove_children': capabilities.get('canRemoveChildren', False),
  97. 'can_rename': capabilities.get('canRename', False),
  98. 'can_share': capabilities.get('canShare', False),
  99. 'can_trash': capabilities.get('canTrash', False),
  100. 'can_trash_children': capabilities.get('canTrashChildren', False),
  101. }
  102. return {
  103. 'success': True,
  104. 'permissions': permissions
  105. }
  106. except Exception as e:
  107. _logger.error(f"Error checking shared drive permissions: {str(e)}")
  108. return {
  109. 'success': False,
  110. 'error': str(e)
  111. }
  112. def create_folder_in_shared_drive(self, name, drive_id, parent_folder_id=None, description=None):
  113. """Create a folder within a Shared Drive"""
  114. try:
  115. drive_service = self.env['google.drive.service']
  116. folder_metadata = {
  117. 'name': name,
  118. 'mimeType': 'application/vnd.google-apps.folder'
  119. }
  120. if parent_folder_id:
  121. folder_metadata['parents'] = [parent_folder_id]
  122. if description:
  123. folder_metadata['description'] = description
  124. # Add Shared Drive parameters
  125. params = drive_service._build_shared_drive_params()
  126. # Build URL with parameters
  127. url = '/drive/v3/files'
  128. if params:
  129. param_string = '&'.join([f"{k}={v}" for k, v in params.items()])
  130. url = f"{url}?{param_string}"
  131. response = drive_service._do_request(url, folder_metadata, method='POST')
  132. return {
  133. 'success': True,
  134. 'folder_id': response.get('id'),
  135. 'folder_name': response.get('name'),
  136. 'folder_url': f"https://drive.google.com/drive/folders/{response.get('id')}"
  137. }
  138. except Exception as e:
  139. _logger.error(f"Error creating folder in shared drive: {str(e)}")
  140. return {
  141. 'success': False,
  142. 'error': str(e)
  143. }
  144. def validate_shared_drive_access(self, drive_id):
  145. """Validate that the current user has access to a Shared Drive"""
  146. try:
  147. # Try to get drive info
  148. drive_info = self.get_shared_drive_info(drive_id)
  149. if not drive_info.get('success'):
  150. return {
  151. 'valid': False,
  152. 'error': drive_info.get('error', 'Unknown error')
  153. }
  154. # Check permissions
  155. permissions = self.check_shared_drive_permissions(drive_id)
  156. if not permissions.get('success'):
  157. return {
  158. 'valid': False,
  159. 'error': permissions.get('error', 'Cannot check permissions')
  160. }
  161. # Check if user has at least read access
  162. user_permissions = permissions.get('permissions', {})
  163. if not user_permissions.get('can_read', False):
  164. return {
  165. 'valid': False,
  166. 'error': 'No read access to this Shared Drive'
  167. }
  168. return {
  169. 'valid': True,
  170. 'drive_name': drive_info.get('drive_info', {}).get('name', 'Unknown'),
  171. 'permissions': user_permissions
  172. }
  173. except Exception as e:
  174. _logger.error(f"Error validating shared drive access: {str(e)}")
  175. return {
  176. 'valid': False,
  177. 'error': str(e)
  178. }
  179. def search_shared_drives_by_name(self, name_pattern):
  180. """Search for Shared Drives by name pattern"""
  181. try:
  182. import re
  183. # Get all shared drives
  184. shared_drives_result = self.list_shared_drives()
  185. if not shared_drives_result.get('success'):
  186. return {
  187. 'success': False,
  188. 'error': shared_drives_result.get('error', 'Cannot list shared drives')
  189. }
  190. shared_drives = shared_drives_result.get('shared_drives', [])
  191. # Filter by name pattern
  192. pattern = re.compile(name_pattern, re.IGNORECASE)
  193. matching_drives = [drive for drive in shared_drives if pattern.search(drive.get('name', ''))]
  194. return {
  195. 'success': True,
  196. 'matching_drives': matching_drives
  197. }
  198. except Exception as e:
  199. _logger.error(f"Error searching shared drives: {str(e)}")
  200. return {
  201. 'success': False,
  202. 'error': str(e)
  203. }