gam7 7.5.16__tar.gz → 7.5.17__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of gam7 might be problematic. Click here for more details.

Files changed (107) hide show
  1. {gam7-7.5.16 → gam7-7.5.17}/PKG-INFO +1 -1
  2. {gam7-7.5.16 → gam7-7.5.17}/src/GamUpdate.txt +7 -0
  3. {gam7-7.5.16 → gam7-7.5.17}/src/gam/__init__.py +9 -9
  4. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/glgapi.py +5 -1
  5. {gam7-7.5.16 → gam7-7.5.17}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  6. {gam7-7.5.16 → gam7-7.5.17}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  7. {gam7-7.5.16 → gam7-7.5.17}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  8. {gam7-7.5.16 → gam7-7.5.17}/.github/ISSUE_TEMPLATE.txt +0 -0
  9. {gam7-7.5.16 → gam7-7.5.17}/.github/actions/creds.tar.xz.gpg +0 -0
  10. {gam7-7.5.16 → gam7-7.5.17}/.github/actions/decrypt.sh +0 -0
  11. {gam7-7.5.16 → gam7-7.5.17}/.github/actions/entitlements.plist +0 -0
  12. {gam7-7.5.16 → gam7-7.5.17}/.github/actions/package_exclusions.txt +0 -0
  13. {gam7-7.5.16 → gam7-7.5.17}/.github/stale.yml +0 -0
  14. {gam7-7.5.16 → gam7-7.5.17}/.github/workflows/build.yml +0 -0
  15. {gam7-7.5.16 → gam7-7.5.17}/.github/workflows/codeql-analysis.yml +0 -0
  16. {gam7-7.5.16 → gam7-7.5.17}/.github/workflows/get-cacerts.yml +0 -0
  17. {gam7-7.5.16 → gam7-7.5.17}/.github/workflows/pypi.yml +0 -0
  18. {gam7-7.5.16 → gam7-7.5.17}/.pre-commit-config.yaml +0 -0
  19. {gam7-7.5.16 → gam7-7.5.17}/LICENSE +0 -0
  20. {gam7-7.5.16 → gam7-7.5.17}/README.md +0 -0
  21. {gam7-7.5.16 → gam7-7.5.17}/pyproject.toml +0 -0
  22. {gam7-7.5.16 → gam7-7.5.17}/src/.gitignore +0 -0
  23. {gam7-7.5.16 → gam7-7.5.17}/src/GamCommands.txt +0 -0
  24. {gam7-7.5.16 → gam7-7.5.17}/src/LICENSE +0 -0
  25. {gam7-7.5.16 → gam7-7.5.17}/src/cacerts.pem +0 -0
  26. {gam7-7.5.16 → gam7-7.5.17}/src/callgam.py +0 -0
  27. {gam7-7.5.16 → gam7-7.5.17}/src/gam/__main__.py +0 -0
  28. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/__init__.py +0 -0
  29. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/auth.py +0 -0
  30. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/client.py +0 -0
  31. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/core.py +0 -0
  32. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/data.py +0 -0
  33. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/http.py +0 -0
  34. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/http_core.py +0 -0
  35. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/http_interface.py +0 -0
  36. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/mock_http.py +0 -0
  37. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/mock_http_core.py +0 -0
  38. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/mock_service.py +0 -0
  39. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/service.py +0 -0
  40. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/token_store.py +0 -0
  41. {gam7-7.5.16 → gam7-7.5.17}/src/gam/atom/url.py +0 -0
  42. {gam7-7.5.16 → gam7-7.5.17}/src/gam/cacerts.pem +0 -0
  43. {gam7-7.5.16 → gam7-7.5.17}/src/gam/cbcm-v1.1beta1.json +0 -0
  44. {gam7-7.5.16 → gam7-7.5.17}/src/gam/contactdelegation-v1.json +0 -0
  45. {gam7-7.5.16 → gam7-7.5.17}/src/gam/datastudio-v1.json +0 -0
  46. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/__init__.py +0 -0
  47. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/glaction.py +0 -0
  48. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/glapi.py +0 -0
  49. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/glcfg.py +0 -0
  50. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/glclargs.py +0 -0
  51. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/glentity.py +0 -0
  52. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/glgdata.py +0 -0
  53. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/glglobals.py +0 -0
  54. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/glindent.py +0 -0
  55. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/glmsgs.py +0 -0
  56. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/glskus.py +0 -0
  57. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/gluprop.py +0 -0
  58. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/glverlibs.py +0 -0
  59. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gamlib/yubikey.py +0 -0
  60. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gdata/__init__.py +0 -0
  61. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gdata/alt/__init__.py +0 -0
  62. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gdata/alt/app_engine.py +0 -0
  63. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gdata/alt/appengine.py +0 -0
  64. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gdata/apps/__init__.py +0 -0
  65. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gdata/apps/audit/__init__.py +0 -0
  66. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gdata/apps/audit/service.py +0 -0
  67. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  68. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gdata/apps/contacts/service.py +0 -0
  69. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gdata/apps/service.py +0 -0
  70. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gdata/service.py +0 -0
  71. {gam7-7.5.16 → gam7-7.5.17}/src/gam/gdata/urlfetch.py +0 -0
  72. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/__init__.py +0 -0
  73. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/_auth.py +0 -0
  74. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/_helpers.py +0 -0
  75. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/channel.py +0 -0
  76. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/discovery.py +0 -0
  77. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  78. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  79. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  80. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  81. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/errors.py +0 -0
  82. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/http.py +0 -0
  83. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/mimeparse.py +0 -0
  84. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/model.py +0 -0
  85. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/schema.py +0 -0
  86. {gam7-7.5.16 → gam7-7.5.17}/src/gam/googleapiclient/version.py +0 -0
  87. {gam7-7.5.16 → gam7-7.5.17}/src/gam/iso8601/__init__.py +0 -0
  88. {gam7-7.5.16 → gam7-7.5.17}/src/gam/iso8601/iso8601.py +0 -0
  89. {gam7-7.5.16 → gam7-7.5.17}/src/gam/meet-v2beta.json +0 -0
  90. {gam7-7.5.16 → gam7-7.5.17}/src/gam/serviceaccountlookup-v1.json +0 -0
  91. {gam7-7.5.16 → gam7-7.5.17}/src/gam/six.py +0 -0
  92. {gam7-7.5.16 → gam7-7.5.17}/src/gam-install.sh +0 -0
  93. {gam7-7.5.16 → gam7-7.5.17}/src/gam-setup.bat +0 -0
  94. {gam7-7.5.16 → gam7-7.5.17}/src/gam.exe.manifest +0 -0
  95. {gam7-7.5.16 → gam7-7.5.17}/src/gam.py +0 -0
  96. {gam7-7.5.16 → gam7-7.5.17}/src/gam.spec +0 -0
  97. {gam7-7.5.16 → gam7-7.5.17}/src/gam.wxs +0 -0
  98. {gam7-7.5.16 → gam7-7.5.17}/src/license.rtf +0 -0
  99. {gam7-7.5.16 → gam7-7.5.17}/src/requirements-dev.txt +0 -0
  100. {gam7-7.5.16 → gam7-7.5.17}/src/requirements.txt +0 -0
  101. {gam7-7.5.16 → gam7-7.5.17}/src/setup.cfg +0 -0
  102. {gam7-7.5.16 → gam7-7.5.17}/src/setup.py +0 -0
  103. {gam7-7.5.16 → gam7-7.5.17}/src/tools/a_atleast_b.py +0 -0
  104. {gam7-7.5.16 → gam7-7.5.17}/src/tools/gen-wix-xml-filelist.py +0 -0
  105. {gam7-7.5.16 → gam7-7.5.17}/src/tools/mkGamRef.py +0 -0
  106. {gam7-7.5.16 → gam7-7.5.17}/src/tools/openssl.props +0 -0
  107. {gam7-7.5.16 → gam7-7.5.17}/src/version_info.txt.in +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.5.16
3
+ Version: 7.5.17
4
4
  Summary: CLI tool to manage Google Workspace
5
5
  Project-URL: Homepage, https://github.com/GAM-team/GAM
6
6
  Project-URL: Issues, https://github.com/GAM-team/GAM/issues
@@ -1,3 +1,10 @@
1
+ 7.05.17
2
+
3
+ Updated commands that delete drive ACLs to handle the following error:
4
+ ```
5
+ ERROR: 403: cannotDeletePermission - The authenticated user does not have the required access to delete the permission.
6
+ ```
7
+
1
8
  7.05.16
2
9
 
3
10
  Added option `transpose [<Boolean>]` to `redirect csv` that causes
@@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
25
25
  """
26
26
 
27
27
  __author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
28
- __version__ = '7.05.16'
28
+ __version__ = '7.05.17'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -58745,7 +58745,7 @@ def _copyPermissions(drive, user, i, count, j, jcount,
58745
58745
  except (GAPI.notFound, GAPI.permissionNotFound,
58746
58746
  GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError,
58747
58747
  GAPI.fileNeverWritable, GAPI.badRequest, GAPI.cannotRemoveOwner, GAPI.cannotModifyInheritedTeamDrivePermission,
58748
- GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded) as e:
58748
+ GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded, GAPI.cannotDeletePermission) as e:
58749
58749
  entityActionFailedWarning(kvList, str(e), k, kcount)
58750
58750
  except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e:
58751
58751
  userDriveServiceNotEnabledWarning(user, str(e), i, count)
@@ -59776,7 +59776,7 @@ def _updateMoveFilePermissions(drive, user, i, count,
59776
59776
  except (GAPI.notFound, GAPI.permissionNotFound,
59777
59777
  GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError,
59778
59778
  GAPI.fileNeverWritable, GAPI.badRequest, GAPI.cannotRemoveOwner, GAPI.cannotModifyInheritedTeamDrivePermission,
59779
- GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded) as e:
59779
+ GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded, GAPI.cannotDeletePermission) as e:
59780
59780
  entityActionFailedWarning(kvList, str(e), k, kcount)
59781
59781
  except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e:
59782
59782
  userDriveServiceNotEnabledWarning(user, str(e), i, count)
@@ -61479,7 +61479,7 @@ def transferDrive(users):
61479
61479
  if showRetentionMessages:
61480
61480
  entityActionPerformed([Ent.USER, sourceUser, childFileType, childFileName, Ent.ROLE, ownerRetainRoleBody['role']], j, jcount)
61481
61481
  except (GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError,
61482
- GAPI.badRequest, GAPI.sharingRateLimitExceeded, GAPI.cannotRemoveOwner) as e:
61482
+ GAPI.badRequest, GAPI.sharingRateLimitExceeded, GAPI.cannotRemoveOwner, GAPI.cannotDeletePermission) as e:
61483
61483
  entityActionFailedWarning([Ent.USER, sourceUser, childFileType, childFileName], str(e), j, jcount)
61484
61484
  except GAPI.permissionNotFound:
61485
61485
  entityDoesNotHaveItemWarning([Ent.USER, sourceUser, childFileType, childFileName, Ent.PERMISSION_ID, sourcePermissionId], j, jcount)
@@ -61532,7 +61532,7 @@ def transferDrive(users):
61532
61532
  if showRetentionMessages:
61533
61533
  entityActionPerformed([Ent.USER, sourceUser, childFileType, childFileName, Ent.ROLE, sourceUpdateRole['role']], j, jcount)
61534
61534
  except (GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError,
61535
- GAPI.badRequest, GAPI.sharingRateLimitExceeded, GAPI.cannotRemoveOwner) as e:
61535
+ GAPI.badRequest, GAPI.sharingRateLimitExceeded, GAPI.cannotRemoveOwner, GAPI.cannotDeletePermission) as e:
61536
61536
  entityActionFailedWarning([Ent.USER, ownerUser, childFileType, childFileName], str(e), j, jcount)
61537
61537
  except GAPI.permissionNotFound:
61538
61538
  entityDoesNotHaveItemWarning([Ent.USER, ownerUser, childFileType, childFileName, Ent.PERMISSION_ID, sourcePermissionId], j, jcount)
@@ -61556,7 +61556,7 @@ def transferDrive(users):
61556
61556
  if showRetentionMessages:
61557
61557
  entityActionPerformed([Ent.USER, targetUser, childFileType, childFileName, Ent.ROLE, targetInsertBody['role']], j, jcount)
61558
61558
  except (GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError,
61559
- GAPI.badRequest, GAPI.sharingRateLimitExceeded) as e:
61559
+ GAPI.badRequest, GAPI.sharingRateLimitExceeded, GAPI.cannotDeletePermission) as e:
61560
61560
  entityActionFailedWarning([Ent.USER, ownerUser, childFileType, childFileName], str(e), j, jcount)
61561
61561
  except GAPI.invalidSharingRequest as e:
61562
61562
  entityActionFailedWarning([Ent.USER, ownerUser, childFileType, childFileName], Ent.TypeNameMessage(Ent.PERMISSION_ID, targetPermissionId, str(e)), j, jcount)
@@ -62299,7 +62299,7 @@ def claimOwnership(users):
62299
62299
  entityActionPerformed([Ent.USER, oldOwner, entityType, fileDesc, Ent.ROLE, sourceRetainRoleBody['role']], l, lcount)
62300
62300
  except GAPI.permissionNotFound:
62301
62301
  entityDoesNotHaveItemWarning([Ent.USER, oldOwner, entityType, fileDesc, Ent.PERMISSION_ID, oldOwnerPermissionId], l, lcount)
62302
- except (GAPI.badRequest, GAPI.insufficientFilePermissions) as e:
62302
+ except (GAPI.badRequest, GAPI.insufficientFilePermissions, GAPI.cannotDeletePermission) as e:
62303
62303
  entityActionFailedWarning([Ent.USER, oldOwner, entityType, fileDesc], str(e), l, lcount)
62304
62304
  except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e:
62305
62305
  userDriveServiceNotEnabledWarning(user, str(e), i, count)
@@ -63471,7 +63471,7 @@ def deleteDriveFileACLs(users, useDomainAdminAccess=False):
63471
63471
  _updateSheetProtectedRangesACLchange(sheet, user, i, count, j, jcount, fileId, fileName, False, permission)
63472
63472
  except (GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError,
63473
63473
  GAPI.fileNeverWritable, GAPI.badRequest, GAPI.cannotRemoveOwner, GAPI.cannotModifyInheritedTeamDrivePermission,
63474
- GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded) as e:
63474
+ GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded, GAPI.cannotDeletePermission) as e:
63475
63475
  entityActionFailedWarning([Ent.USER, user, entityType, fileName], str(e), j, jcount)
63476
63476
  except GAPI.notFound as e:
63477
63477
  entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE, fileName], str(e), j, jcount)
@@ -63527,7 +63527,7 @@ def deletePermissions(users, useDomainAdminAccess=False):
63527
63527
  entityActionPerformed([Ent.DRIVE_FILE_OR_FOLDER_ID, ri[RI_ENTITY], Ent.PERMISSION_ID, ri[RI_ITEM]], int(ri[RI_J]), int(ri[RI_JCOUNT]))
63528
63528
  except (GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError,
63529
63529
  GAPI.badRequest, GAPI.cannotRemoveOwner, GAPI.cannotModifyInheritedTeamDrivePermission,
63530
- GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded, GAPI.permissionNotFound,
63530
+ GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded, GAPI.permissionNotFound, GAPI.cannotDeletePermission,
63531
63531
  GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e:
63532
63532
  entityActionFailedWarning([Ent.DRIVE_FILE_OR_FOLDER_ID, ri[RI_ENTITY], Ent.PERMISSION_ID, ri[RI_ITEM]], str(e), int(ri[RI_J]), int(ri[RI_JCOUNT]))
63533
63533
  if int(ri[RI_J]) == int(ri[RI_JCOUNT]):
@@ -37,6 +37,7 @@ CANNOT_CHANGE_OWNER_ACL = 'cannotChangeOwnerAcl'
37
37
  CANNOT_CHANGE_OWN_PRIMARY_SUBSCRIPTION = 'cannotChangeOwnPrimarySubscription'
38
38
  CANNOT_COPY_FILE = 'cannotCopyFile'
39
39
  CANNOT_DELETE_ONLY_REVISION = 'cannotDeleteOnlyRevision'
40
+ CANNOT_DELETE_PERMISSION = 'cannotDeletePermission'
40
41
  CANNOT_DELETE_PRIMARY_CALENDAR = 'cannotDeletePrimaryCalendar'
41
42
  CANNOT_DELETE_PRIMARY_SENDAS = 'cannotDeletePrimarySendAs'
42
43
  CANNOT_DELETE_RESOURCE_WITH_CHILDREN = 'cannotDeleteResourceWithChildren'
@@ -246,7 +247,7 @@ DRIVE3_UPDATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID_OWNERSHIP_TRANSFER, CANN
246
247
  DRIVE3_DELETE_ACL_THROW_REASONS = [BAD_REQUEST, CANNOT_REMOVE_OWNER,
247
248
  CANNOT_MODIFY_INHERITED_TEAMDRIVE_PERMISSION,
248
249
  INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
249
- NOT_FOUND, PERMISSION_NOT_FOUND]
250
+ NOT_FOUND, PERMISSION_NOT_FOUND, CANNOT_DELETE_PERMISSION]
250
251
  DRIVE3_MODIFY_LABEL_THROW_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND, NOT_FOUND, FORBIDDEN, INTERNAL_ERROR,
251
252
  FILE_NEVER_WRITABLE, APPLY_LABEL_FORBIDDEN,
252
253
  INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, INSUFFICIENT_FILE_PERMISSIONS,
@@ -382,6 +383,8 @@ class cannotCopyFile(Exception):
382
383
  pass
383
384
  class cannotDeleteOnlyRevision(Exception):
384
385
  pass
386
+ class cannotDeletePermission(Exception):
387
+ pass
385
388
  class cannotDeletePrimaryCalendar(Exception):
386
389
  pass
387
390
  class cannotDeletePrimarySendAs(Exception):
@@ -676,6 +679,7 @@ REASON_EXCEPTION_MAP = {
676
679
  CANNOT_CHANGE_OWN_PRIMARY_SUBSCRIPTION: cannotChangeOwnPrimarySubscription,
677
680
  CANNOT_COPY_FILE: cannotCopyFile,
678
681
  CANNOT_DELETE_ONLY_REVISION: cannotDeleteOnlyRevision,
682
+ CANNOT_DELETE_PERMISSION: cannotDeletePermission,
679
683
  CANNOT_DELETE_PRIMARY_CALENDAR: cannotDeletePrimaryCalendar,
680
684
  CANNOT_DELETE_PRIMARY_SENDAS: cannotDeletePrimarySendAs,
681
685
  CANNOT_DELETE_RESOURCE_WITH_CHILDREN: cannotDeleteResourceWithChildren,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes