gam7 7.7.11__tar.gz → 7.7.13__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.
- {gam7-7.7.11 → gam7-7.7.13}/PKG-INFO +1 -1
- {gam7-7.7.11 → gam7-7.7.13}/src/GamUpdate.txt +11 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/__init__.py +68 -57
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glcfg.py +5 -5
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glglobals.py +1 -4
- {gam7-7.7.11 → gam7-7.7.13}/wiki/GamUpdates.md +19 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Groups.md +5 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Copy-Move.md +17 -1
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Version-and-Help.md +6 -6
- {gam7-7.7.11 → gam7-7.7.13}/wiki/gam.cfg.md +5 -3
- {gam7-7.7.11 → gam7-7.7.13}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.github/ISSUE_TEMPLATE.txt +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.github/actions/decrypt.sh +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.github/actions/entitlements.plist +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.github/actions/package_exclusions.txt +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.github/stale.yml +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.github/workflows/build.yml +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.github/workflows/codeql-analysis.yml +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.github/workflows/get-cacerts.yml +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.github/workflows/pushwiki.yml +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.github/workflows/pypi.yml +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/.pre-commit-config.yaml +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/LICENSE +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/README.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/pyproject.toml +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/.gitignore +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/GamCommands.txt +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/LICENSE +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/cacerts.pem +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/callgam.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/__main__.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/__init__.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/auth.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/client.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/core.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/data.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/http.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/http_core.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/http_interface.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/mock_http.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/mock_http_core.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/mock_service.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/service.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/token_store.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/url.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/cacerts.pem +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/cbcm-v1.1beta1.json +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/contactdelegation-v1.json +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/datastudio-v1.json +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/__init__.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glaction.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glapi.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glclargs.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glentity.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glgapi.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glgdata.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glindent.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glmsgs.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glskus.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/gluprop.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glverlibs.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/yubikey.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/__init__.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/alt/__init__.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/alt/app_engine.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/alt/appengine.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/apps/__init__.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/apps/audit/__init__.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/apps/audit/service.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/apps/contacts/__init__.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/apps/contacts/service.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/apps/service.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/service.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/urlfetch.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/__init__.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/_auth.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/_helpers.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/channel.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/discovery.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/errors.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/http.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/mimeparse.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/model.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/schema.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/version.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/iso8601/__init__.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/iso8601/iso8601.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/meet-v2beta.json +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/serviceaccountlookup-v1.json +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam/six.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam-install.sh +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam-setup.bat +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam.exe.manifest +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam.spec +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/gam.wxs +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/license.rtf +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/requirements-dev.txt +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/requirements.txt +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/setup.cfg +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/setup.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/tools/a_atleast_b.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/tools/gen-wix-xml-filelist.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/tools/mkGamRef.py +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/tools/openssl.props +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/src/version_info.txt.in +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/00scratch.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Addresses.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Administrators.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Alert-Center.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Aliases.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Authorization.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/BNF-Syntax.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Basic-Items.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Bulk-Processing.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/CSV-Input-Filtering.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/CSV-Output-Filtering.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/CSV-Special-Characters.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Calendars-Access.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Calendars-Events.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Calendars.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Chat-Bot.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-AUE-Counts.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Installed-Apps.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Policies.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Printers.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Profile-Management.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Version-Counts.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Version-History.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/ChromeOS-Devices.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Classroom-Courses.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Classroom-Guardians.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Classroom-Invitations.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Classroom-Membership.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Cloud-Channel.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Cloud-Identity-Devices.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Cloud-Identity-Groups.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Cloud-Identity-Policies.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Cloud-Storage.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Collections-of-Items.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Collections-of-Users.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Command-Line-Parsing.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Command-Logging-Progress.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Context-Aware-Access-Levels.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Customer.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Domain-People-Contacts-Profiles.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Domain-SharedContacts.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Domains-Verification.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Domains.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Downloads-Installs.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Drive-File-Selection.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Drive-Items.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Drive-REST-API-v3.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Email-Audit-Monitor.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Find-File-Owner.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/GAM-Public-Chat-Room.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/GAM-Return-Codes.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/GAM7-on-Android-Devices.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Google-Data-Transfers.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Google-Network-Addresses.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Groups-Membership.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/HTTPS-Proxy.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Home.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/How-to-Install-GAM7.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/How-to-Uninstall-GAM7.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/How-to-Update-GAM7.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Inbound-SSO.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Install-GAM-as-Python-Library.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Licenses.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/List-Items.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/List.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Mobile-Devices.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Organizational-Units.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Other-Resources.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Permission-Matches.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Python-Regular-Expressions.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/README.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Rclone.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Reports.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Reseller.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Resources.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/SSL-Root-CA-Certificates.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Schemas.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Scripts.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Send-Email.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Shared-Drives.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Sites.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Tag-Replace.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Todrive.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Unmanaged-Accounts.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Upgrade-Benefits.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Analytics-Admin.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Application-Specific-Passwords.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Backup-Verification-Codes.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Calendars-Access.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Calendars-Events.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Calendars.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Chat.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Classification-Labels.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Classroom-Profile.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Contacts-Delegates.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Contacts.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Deprovision.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Activity-Settings.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Cleanup.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Comments.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Files-Display.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Files-Manage.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Orphans.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Ownership.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Permissions.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Query.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Revisions.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Shortcuts.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Transfer.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Forms.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-CSE.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Delegates.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Filters.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Forwarding.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Labels.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Messages-Threads.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Profile.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-S-MIME.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Settings.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Group-Membership.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Keep-Notes.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Looker-Studio.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Meet.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-People-Contacts-Profiles.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Photo.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Profile-Photo.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Profile-Sharing.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Shared-Drives.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Signout-Turnoff2SV.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Spreadsheets.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Tasks.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Tokens.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-YouTube.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Users.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Vault-Takeout.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/_Sidebar.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-AdminSettingsExamples.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Android-Installation.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-BulkOperations.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-CalendarExamples.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Chat-Bot.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Chrome-Browser-Management.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Chrome-OS-Installation.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Chrome-Policy-Settings.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Cloud-Identity-Groups.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Calendars.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Definitions.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Drive.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Email.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Groups.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Users.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Context-Aware-Access-Levels.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-CreatingClientSecretsFile.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Custom-Schemas.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Data-Transfers.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-DomainVerification.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-ExamplesAccountAuditing.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-ExamplesCSV.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-ExamplesEmailSettings.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-ExamplesOrganizations.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM-Discussion-Group.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM-options-files.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM3CSVListings.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM3DirectoryCommands.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM3GroupSettings.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM7-FAQ.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GoogleDriveManagement.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Home.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Inbound-SSO-Settings.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-LicenseExamples.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Managing-Admins.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Managing-Devices.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Managing-Google-Classroom.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-OAuthKeyManagement.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Printers.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-ResellerCommands.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-SecurityExamples.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-UnmanagedUsersExamples.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Use-a-Yubikey.md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
- {gam7-7.7.11 → gam7-7.7.13}/wiki/l-_Footer.md +0 -0
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
7.07.13
|
|
2
|
+
|
|
3
|
+
Added option `showitemcountonly` to `gam [<UserTypeEntity>] print|show shareddrives` that causes GAM to display the
|
|
4
|
+
number of Shared Drives on stdout; no CSV file is written.
|
|
5
|
+
|
|
6
|
+
7.07.12
|
|
7
|
+
|
|
8
|
+
Fixed bug in `gam print|show oushareddrives` that caused a trap.
|
|
9
|
+
|
|
10
|
+
Improved getting Shared Drive names from IDs when accessing Shared Drives in external workspaces.
|
|
11
|
+
|
|
1
12
|
7.07.11
|
|
2
13
|
|
|
3
14
|
Updated `gam calendars <CalendarEntity> update events` and `gam <UserTypeEntity> update events <UserCalendarEntity>`
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
#
|
|
4
4
|
# GAM7
|
|
5
5
|
#
|
|
6
|
-
# Copyright
|
|
6
|
+
# Copyright 2025, All Rights Reserved.
|
|
7
7
|
#
|
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
9
|
# you may not use this file except in compliance with the License.
|
|
@@ -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.07.
|
|
28
|
+
__version__ = '7.07.13'
|
|
29
29
|
__license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
|
|
30
30
|
|
|
31
31
|
#pylint: disable=wrong-import-position
|
|
@@ -42021,22 +42021,21 @@ def printShowUserVaultHolds(entityList):
|
|
|
42021
42021
|
else:
|
|
42022
42022
|
printKeyValueList(['Total Holds', totalHolds])
|
|
42023
42023
|
|
|
42024
|
-
def _cleanVaultQuery(query, cd):
|
|
42024
|
+
def _cleanVaultQuery(query, cd, drive):
|
|
42025
42025
|
if 'query' in query:
|
|
42026
|
-
if cd is not None:
|
|
42027
|
-
|
|
42028
|
-
|
|
42029
|
-
|
|
42030
|
-
|
|
42031
|
-
|
|
42032
|
-
query['query']['sharedDriveInfo']['sharedDriveNames'].append(_getSharedDriveNameFromId(sharedDriveId))
|
|
42026
|
+
if cd is not None and 'orgUnitInfo' in query['query']:
|
|
42027
|
+
query['query']['orgUnitInfo']['orgUnitPath'] = convertOrgUnitIDtoPath(cd, query['query']['orgUnitInfo']['orgUnitId'])
|
|
42028
|
+
if drive is not None and 'sharedDriveInfo' in query['query']:
|
|
42029
|
+
query['query']['sharedDriveInfo']['sharedDriveNames'] = []
|
|
42030
|
+
for sharedDriveId in query['query']['sharedDriveInfo']['sharedDriveIds']:
|
|
42031
|
+
query['query']['sharedDriveInfo']['sharedDriveNames'].append(_getSharedDriveNameFromId(drive, sharedDriveId, False))
|
|
42033
42032
|
query['query'].pop('searchMethod', None)
|
|
42034
42033
|
query['query'].pop('teamDriveInfo', None)
|
|
42035
42034
|
|
|
42036
42035
|
VAULT_QUERY_TIME_OBJECTS = {'createTime', 'endTime', 'startTime', 'versionDate'}
|
|
42037
42036
|
|
|
42038
|
-
def _showVaultQuery(matterNameId, query, cd, FJQC, k=0, kcount=0):
|
|
42039
|
-
_cleanVaultQuery(query, cd)
|
|
42037
|
+
def _showVaultQuery(matterNameId, query, cd, drive, FJQC, k=0, kcount=0):
|
|
42038
|
+
_cleanVaultQuery(query, cd, drive)
|
|
42040
42039
|
if FJQC is not None and FJQC.formatJSON:
|
|
42041
42040
|
printLine(json.dumps(cleanJSON(query, timeObjects=VAULT_QUERY_TIME_OBJECTS), ensure_ascii=False, sort_keys=False))
|
|
42042
42041
|
return
|
|
@@ -42068,7 +42067,7 @@ def doInfoVaultQuery():
|
|
|
42068
42067
|
queryId, queryName, queryNameId = convertQueryNameToID(v, getString(Cmd.OB_QUERY_ITEM), matterId, matterNameId)
|
|
42069
42068
|
else:
|
|
42070
42069
|
queryName = getString(Cmd.OB_QUERY_ITEM)
|
|
42071
|
-
cd = None
|
|
42070
|
+
cd = drive = None
|
|
42072
42071
|
fieldsList = []
|
|
42073
42072
|
FJQC = FormatJSONQuoteChar()
|
|
42074
42073
|
while Cmd.ArgumentsRemaining():
|
|
@@ -42078,8 +42077,8 @@ def doInfoVaultQuery():
|
|
|
42078
42077
|
queryId, queryName, queryNameId = convertQueryNameToID(v, queryName, matterId, matterNameId)
|
|
42079
42078
|
elif myarg == 'shownames':
|
|
42080
42079
|
cd = buildGAPIObject(API.DIRECTORY)
|
|
42081
|
-
_,
|
|
42082
|
-
if
|
|
42080
|
+
_, drive = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
|
|
42081
|
+
if drive is None:
|
|
42083
42082
|
return
|
|
42084
42083
|
elif getFieldsList(myarg, VAULT_QUERY_FIELDS_CHOICE_MAP, fieldsList, initialField=['savedQueryId', 'displayName']):
|
|
42085
42084
|
pass
|
|
@@ -42090,7 +42089,7 @@ def doInfoVaultQuery():
|
|
|
42090
42089
|
query = callGAPI(v.matters().savedQueries(), 'get',
|
|
42091
42090
|
throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
|
|
42092
42091
|
matterId=matterId, savedQueryId=queryId, fields=fields)
|
|
42093
|
-
_showVaultQuery(matterNameId, query, cd, FJQC)
|
|
42092
|
+
_showVaultQuery(matterNameId, query, cd, drive, FJQC)
|
|
42094
42093
|
except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden, GAPI.invalidArgument) as e:
|
|
42095
42094
|
entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_QUERY, queryNameId], str(e))
|
|
42096
42095
|
|
|
@@ -42107,7 +42106,7 @@ def doPrintShowVaultQueries():
|
|
|
42107
42106
|
csvPF = CSVPrintFile(PRINT_VAULT_QUERIES_TITLES, 'sortall') if Act.csvFormat() else None
|
|
42108
42107
|
FJQC = FormatJSONQuoteChar(csvPF)
|
|
42109
42108
|
matters = []
|
|
42110
|
-
cd = None
|
|
42109
|
+
cd = drive = None
|
|
42111
42110
|
fieldsList = []
|
|
42112
42111
|
while Cmd.ArgumentsRemaining():
|
|
42113
42112
|
myarg = getArgument()
|
|
@@ -42117,8 +42116,8 @@ def doPrintShowVaultQueries():
|
|
|
42117
42116
|
matters = shlexSplitList(getString(Cmd.OB_MATTER_ITEM_LIST))
|
|
42118
42117
|
elif myarg == 'shownames':
|
|
42119
42118
|
cd = buildGAPIObject(API.DIRECTORY)
|
|
42120
|
-
_,
|
|
42121
|
-
if
|
|
42119
|
+
_, drive = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
|
|
42120
|
+
if drive is None:
|
|
42122
42121
|
return
|
|
42123
42122
|
elif getFieldsList(myarg, VAULT_QUERY_FIELDS_CHOICE_MAP, fieldsList, initialField=['savedQueryId', 'displayName']):
|
|
42124
42123
|
pass
|
|
@@ -42180,11 +42179,11 @@ def doPrintShowVaultQueries():
|
|
|
42180
42179
|
k = 0
|
|
42181
42180
|
for query in queries:
|
|
42182
42181
|
k += 1
|
|
42183
|
-
_showVaultQuery(matterNameId, query, cd, FJQC, k, kcount)
|
|
42182
|
+
_showVaultQuery(matterNameId, query, cd, drive, FJQC, k, kcount)
|
|
42184
42183
|
Ind.Decrement()
|
|
42185
42184
|
else:
|
|
42186
42185
|
for query in queries:
|
|
42187
|
-
_cleanVaultQuery(query, cd)
|
|
42186
|
+
_cleanVaultQuery(query, cd, drive)
|
|
42188
42187
|
row = flattenJSON(query, flattened={'matterId': matterId, 'matterName': matterName}, timeObjects=VAULT_QUERY_TIME_OBJECTS)
|
|
42189
42188
|
if not FJQC.formatJSON:
|
|
42190
42189
|
csvPF.WriteRowTitles(row)
|
|
@@ -52447,20 +52446,15 @@ def _convertSharedDriveNameToId(drive, user, i, count, fileIdEntity, useDomainAd
|
|
|
52447
52446
|
','.join([td['id'] for td in tdlist])), i, count)
|
|
52448
52447
|
return False
|
|
52449
52448
|
|
|
52450
|
-
def _getSharedDriveNameFromId(sharedDriveId):
|
|
52449
|
+
def _getSharedDriveNameFromId(drive, sharedDriveId, useDomainAdminAccess=False):
|
|
52451
52450
|
sharedDriveName = GM.Globals[GM.MAP_SHAREDDRIVE_ID_TO_NAME].get(sharedDriveId)
|
|
52452
52451
|
if not sharedDriveName:
|
|
52453
|
-
|
|
52454
|
-
|
|
52455
|
-
|
|
52456
|
-
|
|
52457
|
-
|
|
52458
|
-
|
|
52459
|
-
useDomainAdminAccess=True,
|
|
52460
|
-
driveId=sharedDriveId, fields='name')['name']
|
|
52461
|
-
except (GAPI.notFound, GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy):
|
|
52462
|
-
sharedDriveName = TEAM_DRIVE
|
|
52463
|
-
else:
|
|
52452
|
+
try:
|
|
52453
|
+
sharedDriveName = callGAPI(drive.drives(), 'get',
|
|
52454
|
+
throwReasons=GAPI.DRIVE_USER_THROW_REASONS+[GAPI.NOT_FOUND],
|
|
52455
|
+
useDomainAdminAccess=useDomainAdminAccess,
|
|
52456
|
+
driveId=sharedDriveId, fields='name')['name']
|
|
52457
|
+
except (GAPI.notFound, GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy):
|
|
52464
52458
|
sharedDriveName = TEAM_DRIVE
|
|
52465
52459
|
GM.Globals[GM.MAP_SHAREDDRIVE_ID_TO_NAME][sharedDriveId] = sharedDriveName
|
|
52466
52460
|
return sharedDriveName
|
|
@@ -52473,7 +52467,7 @@ def _getDriveFileNameFromId(drive, fileId, combineTitleId=True, useDomainAdminAc
|
|
|
52473
52467
|
if result:
|
|
52474
52468
|
fileName = result['name']
|
|
52475
52469
|
if (result['mimeType'] == MIMETYPE_GA_FOLDER) and result.get('driveId') and (result['name'] == TEAM_DRIVE):
|
|
52476
|
-
fileName = _getSharedDriveNameFromId(result['driveId'])
|
|
52470
|
+
fileName = _getSharedDriveNameFromId(drive, result['driveId'])
|
|
52477
52471
|
if combineTitleId:
|
|
52478
52472
|
fileName += '('+fileId+')'
|
|
52479
52473
|
return (fileName, _getEntityMimeType(result), result['mimeType'])
|
|
@@ -53555,7 +53549,7 @@ def getFilePaths(drive, fileTree, initialResult, filePathInfo, addParentsToTree=
|
|
|
53555
53549
|
fullpath=False, showDepth=False, folderPathOnly=False):
|
|
53556
53550
|
def _getParentName(result):
|
|
53557
53551
|
if (result['mimeType'] == MIMETYPE_GA_FOLDER) and result.get('driveId') and (result['name'] == TEAM_DRIVE):
|
|
53558
|
-
parentName = _getSharedDriveNameFromId(result['driveId'])
|
|
53552
|
+
parentName = _getSharedDriveNameFromId(drive, result['driveId'])
|
|
53559
53553
|
if parentName != TEAM_DRIVE:
|
|
53560
53554
|
return f'{SHARED_DRIVES}{filePathInfo["delimiter"]}{parentName}'
|
|
53561
53555
|
return result['name']
|
|
@@ -54254,9 +54248,9 @@ def showFileInfo(users):
|
|
|
54254
54248
|
driveId = result.get('driveId')
|
|
54255
54249
|
if driveId:
|
|
54256
54250
|
if result['mimeType'] == MIMETYPE_GA_FOLDER and result['name'] == TEAM_DRIVE:
|
|
54257
|
-
result['name'] = _getSharedDriveNameFromId(driveId)
|
|
54251
|
+
result['name'] = _getSharedDriveNameFromId(drive, driveId)
|
|
54258
54252
|
if DFF.showSharedDriveNames:
|
|
54259
|
-
result['driveName'] = _getSharedDriveNameFromId(driveId)
|
|
54253
|
+
result['driveName'] = _getSharedDriveNameFromId(drive, driveId)
|
|
54260
54254
|
if showNoParents:
|
|
54261
54255
|
result.setdefault('parents', [])
|
|
54262
54256
|
if getPermissionsForSharedDrives and driveId and 'permissions' not in result:
|
|
@@ -54944,7 +54938,7 @@ def extendFileTreeParents(drive, fileTree, fields):
|
|
|
54944
54938
|
result['parents'] = [ORPHANS] if result.get('ownedByMe', False) and 'sharedWithMeTime' not in result else [SHARED_WITHME]
|
|
54945
54939
|
else:
|
|
54946
54940
|
if result['name'] == TEAM_DRIVE:
|
|
54947
|
-
result['name'] = _getSharedDriveNameFromId(result['driveId'])
|
|
54941
|
+
result['name'] = _getSharedDriveNameFromId(drive, result['driveId'])
|
|
54948
54942
|
result['parents'] = [SHARED_DRIVES] if 'sharedWithMeTime' not in result else [SHARED_WITHME]
|
|
54949
54943
|
fileTree[fileId]['info'] = result
|
|
54950
54944
|
fileTree[fileId]['info']['noDisplay'] = True
|
|
@@ -55689,7 +55683,7 @@ def printFileList(users):
|
|
|
55689
55683
|
if not pmselect and 'permissions' in fileInfo:
|
|
55690
55684
|
fileInfo['permissions'] = DLP.GetFileMatchingPermission(fileInfo)
|
|
55691
55685
|
if DFF.showSharedDriveNames and driveId:
|
|
55692
|
-
fileInfo['driveName'] = _getSharedDriveNameFromId(driveId)
|
|
55686
|
+
fileInfo['driveName'] = _getSharedDriveNameFromId(drive, driveId)
|
|
55693
55687
|
if filepath:
|
|
55694
55688
|
if not FJQC.formatJSON or not addPathsToJSON:
|
|
55695
55689
|
addFilePathsToRow(drive, fileTree, fileInfo, filePathInfo, csvPF, row,
|
|
@@ -56559,7 +56553,7 @@ def printShowFilePaths(users):
|
|
|
56559
56553
|
driveId = result.get('driveId')
|
|
56560
56554
|
if driveId:
|
|
56561
56555
|
if result['mimeType'] == MIMETYPE_GA_FOLDER and result['name'] == TEAM_DRIVE:
|
|
56562
|
-
result['name'] = _getSharedDriveNameFromId(driveId)
|
|
56556
|
+
result['name'] = _getSharedDriveNameFromId(drive, driveId)
|
|
56563
56557
|
if returnPathOnly:
|
|
56564
56558
|
if fullpath:
|
|
56565
56559
|
writeStdout(f'{SHARED_DRIVES}/{result["name"]}\n')
|
|
@@ -56649,7 +56643,7 @@ def printFileParentTree(users):
|
|
|
56649
56643
|
driveId = result.get('driveId')
|
|
56650
56644
|
if driveId:
|
|
56651
56645
|
if result['mimeType'] == MIMETYPE_GA_FOLDER and result['name'] == TEAM_DRIVE:
|
|
56652
|
-
result['name'] = _getSharedDriveNameFromId(driveId)
|
|
56646
|
+
result['name'] = _getSharedDriveNameFromId(drive, driveId)
|
|
56653
56647
|
result['isRoot'] = True
|
|
56654
56648
|
result['parents'] = ['']
|
|
56655
56649
|
fileList.append(result)
|
|
@@ -56886,7 +56880,7 @@ def printShowFileCounts(users):
|
|
|
56886
56880
|
if not drive:
|
|
56887
56881
|
continue
|
|
56888
56882
|
sharedDriveId = fileIdEntity.get('shareddrive', {}).get('driveId', '')
|
|
56889
|
-
sharedDriveName = _getSharedDriveNameFromId(sharedDriveId) if sharedDriveId else ''
|
|
56883
|
+
sharedDriveName = _getSharedDriveNameFromId(drive, sharedDriveId) if sharedDriveId else ''
|
|
56890
56884
|
mimeTypeInfo = {}
|
|
56891
56885
|
userLastModification = _initLastModification()
|
|
56892
56886
|
gettingEntity = _getGettingEntity(user, fileIdEntity)
|
|
@@ -57031,7 +57025,7 @@ def printShowDrivelastModifications(users):
|
|
|
57031
57025
|
if not drive:
|
|
57032
57026
|
continue
|
|
57033
57027
|
sharedDriveId = fileIdEntity.get('shareddrive', {}).get('driveId', '')
|
|
57034
|
-
sharedDriveName = _getSharedDriveNameFromId(sharedDriveId) if sharedDriveId else ''
|
|
57028
|
+
sharedDriveName = _getSharedDriveNameFromId(drive, sharedDriveId) if sharedDriveId else ''
|
|
57035
57029
|
userLastModification = _initLastModification()
|
|
57036
57030
|
gettingEntity = _getGettingEntity(user, fileIdEntity)
|
|
57037
57031
|
printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, gettingEntity, i, count)
|
|
@@ -57214,7 +57208,7 @@ def printDiskUsage(users):
|
|
|
57214
57208
|
includeOwner = False
|
|
57215
57209
|
csvPF.RemoveTitles(['Owner', 'ownedByMe'])
|
|
57216
57210
|
if topFolder['name'] == TEAM_DRIVE and not topFolder.get('parents'):
|
|
57217
|
-
topFolder['name'] = _getSharedDriveNameFromId(driveId)
|
|
57211
|
+
topFolder['name'] = _getSharedDriveNameFromId(drive, driveId)
|
|
57218
57212
|
topFolder['path'] = f'{SHARED_DRIVES}{pathDelimiter}{topFolder["name"]}'
|
|
57219
57213
|
else:
|
|
57220
57214
|
topFolder['path'] = topFolder['name']
|
|
@@ -57654,7 +57648,7 @@ def printShowFileTree(users):
|
|
|
57654
57648
|
fileId=fileId, fields=fields, supportsAllDrives=True)
|
|
57655
57649
|
if (fileEntryInfo['mimeType'] == MIMETYPE_GA_FOLDER and fileEntryInfo.get('driveId') and
|
|
57656
57650
|
fileEntryInfo['name'] == TEAM_DRIVE and not fileEntryInfo.get('parents', [])):
|
|
57657
|
-
fileEntryInfo['name'] = f"{SHARED_DRIVES}/{_getSharedDriveNameFromId(fileId)}"
|
|
57651
|
+
fileEntryInfo['name'] = f"{SHARED_DRIVES}/{_getSharedDriveNameFromId(drive, fileId)}"
|
|
57658
57652
|
if stripCRsFromName:
|
|
57659
57653
|
fileEntryInfo['name'] = _stripControlCharsFromName(fileEntryInfo['name'])
|
|
57660
57654
|
if buildTree:
|
|
@@ -59295,7 +59289,7 @@ def _getCopyMoveParentInfo(drive, user, i, count, j, jcount, newParentId, statis
|
|
|
59295
59289
|
result['destParentType'] = DEST_PARENT_MYDRIVE_FOLDER
|
|
59296
59290
|
else:
|
|
59297
59291
|
if result['name'] == TEAM_DRIVE and not result.get('parents', []):
|
|
59298
|
-
result['name'] = _getSharedDriveNameFromId(result['driveId'])
|
|
59292
|
+
result['name'] = _getSharedDriveNameFromId(drive, result['driveId'])
|
|
59299
59293
|
result['destParentType'] = DEST_PARENT_SHAREDDRIVE_ROOT
|
|
59300
59294
|
else:
|
|
59301
59295
|
result['destParentType'] = DEST_PARENT_SHAREDDRIVE_FOLDER
|
|
@@ -59844,7 +59838,8 @@ def copyDriveFile(users):
|
|
|
59844
59838
|
# Source at root of Shared Drive?
|
|
59845
59839
|
sourceMimeType = source['mimeType']
|
|
59846
59840
|
if sourceMimeType == MIMETYPE_GA_FOLDER and source.get('driveId') and source['name'] == TEAM_DRIVE and not source.get('parents', []):
|
|
59847
|
-
|
|
59841
|
+
copyMoveOptions['sourceIsMyDriveSharedDrive'] = True
|
|
59842
|
+
source['name'] = _getSharedDriveNameFromId(drive, source['driveId'])
|
|
59848
59843
|
sourceName = source['name']
|
|
59849
59844
|
sourceNameId = f"{sourceName}({source['id']})"
|
|
59850
59845
|
copyMoveOptions['sourceDriveId'] = source.get('driveId')
|
|
@@ -60615,7 +60610,7 @@ def moveDriveFile(users):
|
|
|
60615
60610
|
if sourceMimeType == MIMETYPE_GA_FOLDER and source['name'] in [MY_DRIVE, TEAM_DRIVE] and not source.get('parents', []):
|
|
60616
60611
|
copyMoveOptions['sourceIsMyDriveSharedDrive'] = True
|
|
60617
60612
|
if source.get('driveId'):
|
|
60618
|
-
source['name'] = _getSharedDriveNameFromId(source['driveId'])
|
|
60613
|
+
source['name'] = _getSharedDriveNameFromId(drive, source['driveId'])
|
|
60619
60614
|
sourceName = source['name']
|
|
60620
60615
|
sourceNameId = f"{sourceName}({source['id']})"
|
|
60621
60616
|
copyMoveOptions['sourceDriveId'] = source.get('driveId')
|
|
@@ -63059,7 +63054,7 @@ def printEmptyDriveFolders(users):
|
|
|
63059
63054
|
fileIdEntity['shareddrive'] = {'driveId': sharedDriveId, 'corpora': 'drive', 'includeItemsFromAllDrives': True, 'supportsAllDrives': True}
|
|
63060
63055
|
csvPF.AddTitles(['driveId'])
|
|
63061
63056
|
csvPF.MoveTitlesToEnd(['name'])
|
|
63062
|
-
pathList = [f'{SHARED_DRIVES}/{_getSharedDriveNameFromId(sharedDriveId)}']
|
|
63057
|
+
pathList = [f'{SHARED_DRIVES}/{_getSharedDriveNameFromId(drive, sharedDriveId)}']
|
|
63063
63058
|
else:
|
|
63064
63059
|
pathList = [fileEntryInfo['name']]
|
|
63065
63060
|
mimeType = fileEntryInfo['mimeType']
|
|
@@ -63149,7 +63144,7 @@ def deleteEmptyDriveFolders(users):
|
|
|
63149
63144
|
if 'driveId' in fileEntryInfo:
|
|
63150
63145
|
sharedDriveId = fileEntryInfo['driveId']
|
|
63151
63146
|
fileIdEntity['shareddrive'] = {'driveId': sharedDriveId, 'corpora': 'drive', 'includeItemsFromAllDrives': True, 'supportsAllDrives': True}
|
|
63152
|
-
pathList = [f'{SHARED_DRIVES}/{_getSharedDriveNameFromId(sharedDriveId)}']
|
|
63147
|
+
pathList = [f'{SHARED_DRIVES}/{_getSharedDriveNameFromId(drive, sharedDriveId)}']
|
|
63153
63148
|
else:
|
|
63154
63149
|
pathList = [fileEntryInfo['name']]
|
|
63155
63150
|
mimeType = fileEntryInfo['mimeType']
|
|
@@ -65422,12 +65417,14 @@ SHAREDDRIVE_ACL_ROLES_MAP = {
|
|
|
65422
65417
|
# (role|roles <SharedDriveACLRoleList>)*
|
|
65423
65418
|
# [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
|
|
65424
65419
|
# [guiroles [<Boolean>]] [formatjson [quotechar <Character>]]
|
|
65420
|
+
# [showitemcountonly]
|
|
65425
65421
|
# gam <UserTypeEntity> show shareddrives
|
|
65426
65422
|
# [asadmin [shareddriveadminquery|query <QuerySharedDrive>]]
|
|
65427
65423
|
# [matchname <REMatchPattrn>] [orgunit|org|ou <OrgUnitPath>]
|
|
65428
65424
|
# (role|roles <SharedDriveACLRoleLIst>)*
|
|
65429
65425
|
# [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
|
|
65430
65426
|
# [guiroles [<Boolean>]] [formatjson]
|
|
65427
|
+
# [showitemcountonly]
|
|
65431
65428
|
def printShowSharedDrives(users, useDomainAdminAccess=False):
|
|
65432
65429
|
def stripNonShowFields(shareddrive):
|
|
65433
65430
|
if orgUnitIdToPathMap:
|
|
@@ -65451,7 +65448,7 @@ def printShowSharedDrives(users, useDomainAdminAccess=False):
|
|
|
65451
65448
|
SHAREDDRIVE_FIELDS_CHOICE_MAP.update(SHAREDDRIVE_LIST_FIELDS_CHOICE_MAP)
|
|
65452
65449
|
showOrgUnitPaths = True
|
|
65453
65450
|
orgUnitIdToPathMap = None
|
|
65454
|
-
guiRoles = False
|
|
65451
|
+
guiRoles = showItemCountOnly = False
|
|
65455
65452
|
while Cmd.ArgumentsRemaining():
|
|
65456
65453
|
myarg = getArgument()
|
|
65457
65454
|
if csvPF and myarg == 'todrive':
|
|
@@ -65481,6 +65478,9 @@ def printShowSharedDrives(users, useDomainAdminAccess=False):
|
|
|
65481
65478
|
showOrgUnitPaths = not getBoolean()
|
|
65482
65479
|
elif myarg == 'guiroles':
|
|
65483
65480
|
guiRoles = getBoolean()
|
|
65481
|
+
elif myarg == 'showitemcountonly':
|
|
65482
|
+
showItemCountOnly = True
|
|
65483
|
+
showOrgUnitPaths = False
|
|
65484
65484
|
else:
|
|
65485
65485
|
FJQC.GetFormatJSONQuoteChar(myarg, True)
|
|
65486
65486
|
if query and not useDomainAdminAccess:
|
|
@@ -65550,6 +65550,9 @@ def printShowSharedDrives(users, useDomainAdminAccess=False):
|
|
|
65550
65550
|
jcount = len(matchedFeed)
|
|
65551
65551
|
if jcount == 0:
|
|
65552
65552
|
setSysExitRC(NO_ENTITIES_FOUND_RC)
|
|
65553
|
+
if showItemCountOnly:
|
|
65554
|
+
writeStdout(f'{jcount}\n')
|
|
65555
|
+
return
|
|
65553
65556
|
if not csvPF:
|
|
65554
65557
|
if not FJQC.formatJSON:
|
|
65555
65558
|
entityPerformActionNumItems([Ent.USER, user], jcount, Ent.SHAREDDRIVE, i, count)
|
|
@@ -65580,13 +65583,15 @@ def doPrintShowSharedDrives():
|
|
|
65580
65583
|
# gam print oushareddrives [todrive <ToDriveAttribute>*]
|
|
65581
65584
|
# [ou|org|orgunit <OrgUnitPath>]
|
|
65582
65585
|
# [formatjson [quotechar <Character>]]
|
|
65586
|
+
# [showitemcountonly]
|
|
65583
65587
|
# gam show oushareddrives
|
|
65584
65588
|
# [ou|org|orgunit <OrgUnitPath>]
|
|
65585
65589
|
# [formatjson]
|
|
65590
|
+
# [showitemcountonly]
|
|
65586
65591
|
def doPrintShowOrgunitSharedDrives():
|
|
65587
65592
|
def _getOrgUnitSharedDriveInfo(shareddrive):
|
|
65588
65593
|
shareddrive['driveId'] = shareddrive['name'].rsplit(';')[1]
|
|
65589
|
-
shareddrive['driveName'] = _getSharedDriveNameFromId(shareddrive['driveId'])
|
|
65594
|
+
shareddrive['driveName'] = _getSharedDriveNameFromId(drive, shareddrive['driveId'], True)
|
|
65590
65595
|
shareddrive['orgUnitPath'] = orgUnitPath
|
|
65591
65596
|
|
|
65592
65597
|
def _showOrgUnitSharedDrive(shareddrive, j, jcount, FJQC):
|
|
@@ -65600,23 +65605,26 @@ def doPrintShowOrgunitSharedDrives():
|
|
|
65600
65605
|
printEntity([Ent.MEMBER_URI, shareddrive['memberUri']])
|
|
65601
65606
|
printEntity([Ent.SHAREDDRIVE_ID, shareddrive['driveId']])
|
|
65602
65607
|
printEntity([Ent.SHAREDDRIVE_NAME, shareddrive['driveName']])
|
|
65603
|
-
printEntity([Ent.ORGANIZATIONAL_UNIT, shareddrive['
|
|
65608
|
+
printEntity([Ent.ORGANIZATIONAL_UNIT, shareddrive['orgUnitPath']])
|
|
65604
65609
|
Ind.Decrement()
|
|
65605
65610
|
|
|
65606
65611
|
ci = buildGAPIObject(API.CLOUDIDENTITY_ORGUNITS_BETA)
|
|
65607
65612
|
cd = buildGAPIObject(API.DIRECTORY)
|
|
65608
|
-
_,
|
|
65609
|
-
if
|
|
65613
|
+
_, drive = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
|
|
65614
|
+
if drive is None:
|
|
65610
65615
|
return
|
|
65611
65616
|
csvPF = CSVPrintFile(['name', 'type', 'member', 'memberUri', 'driveId', 'driveName', 'orgUnitPath']) if Act.csvFormat() else None
|
|
65612
65617
|
FJQC = FormatJSONQuoteChar(csvPF)
|
|
65613
65618
|
orgUnitPath = '/'
|
|
65619
|
+
showItemCountOnly = False
|
|
65614
65620
|
while Cmd.ArgumentsRemaining():
|
|
65615
65621
|
myarg = getArgument()
|
|
65616
65622
|
if csvPF and myarg == 'todrive':
|
|
65617
65623
|
csvPF.GetTodriveParameters()
|
|
65618
65624
|
elif myarg in {'ou', 'org', 'orgunit'}:
|
|
65619
65625
|
orgUnitPath = getString(Cmd.OB_ORGUNIT_ITEM)
|
|
65626
|
+
elif myarg == 'showitemcountonly':
|
|
65627
|
+
showItemCountOnly = True
|
|
65620
65628
|
else:
|
|
65621
65629
|
FJQC.GetFormatJSONQuoteChar(myarg, True)
|
|
65622
65630
|
if csvPF and FJQC.formatJSON:
|
|
@@ -65631,6 +65639,9 @@ def doPrintShowOrgunitSharedDrives():
|
|
|
65631
65639
|
jcount = len(sds)
|
|
65632
65640
|
if jcount == 0:
|
|
65633
65641
|
setSysExitRC(NO_ENTITIES_FOUND_RC)
|
|
65642
|
+
if showItemCountOnly:
|
|
65643
|
+
writeStdout(f'{jcount}\n')
|
|
65644
|
+
return
|
|
65634
65645
|
if not csvPF:
|
|
65635
65646
|
if not FJQC.formatJSON:
|
|
65636
65647
|
entityPerformActionNumItems([Ent.ORGANIZATIONAL_UNIT, orgUnitPath], jcount, Ent.SHAREDDRIVE)
|
|
@@ -65685,13 +65696,13 @@ def copySyncSharedDriveACLs(users, useDomainAdminAccess=False):
|
|
|
65685
65696
|
if not drive:
|
|
65686
65697
|
continue
|
|
65687
65698
|
if not srcFileIdEntity.get('shareddrivename'):
|
|
65688
|
-
srcFileIdEntity['shareddrivename'] = _getSharedDriveNameFromId(srcFileIdEntity['shareddrive']['driveId'])
|
|
65699
|
+
srcFileIdEntity['shareddrivename'] = _getSharedDriveNameFromId(drive, srcFileIdEntity['shareddrive']['driveId'])
|
|
65689
65700
|
if tgtFileIdEntity.get('shareddrivename'):
|
|
65690
65701
|
if not _convertSharedDriveNameToId(drive, user, i, count, tgtFileIdEntity, useDomainAdminAccess):
|
|
65691
65702
|
continue
|
|
65692
65703
|
tgtFileIdEntity['shareddrive']['corpora'] = 'drive'
|
|
65693
65704
|
else:
|
|
65694
|
-
tgtFileIdEntity['shareddrivename'] = _getSharedDriveNameFromId(tgtFileIdEntity['shareddrive']['driveId'])
|
|
65705
|
+
tgtFileIdEntity['shareddrivename'] = _getSharedDriveNameFromId(drive, tgtFileIdEntity['shareddrive']['driveId'])
|
|
65695
65706
|
statistics = _initStatistics()
|
|
65696
65707
|
copyMoveOptions['sourceDriveId'] = srcFileIdEntity['shareddrive']['driveId']
|
|
65697
65708
|
copyMoveOptions['destDriveId'] = tgtFileIdEntity['shareddrive']['driveId']
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
|
|
3
|
-
# Copyright (C)
|
|
3
|
+
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
|
4
4
|
#
|
|
5
5
|
# All Rights Reserved.
|
|
6
6
|
#
|
|
@@ -260,12 +260,12 @@ SMTP_HOST = 'smtp_host'
|
|
|
260
260
|
SMTP_USERNAME = 'smtp_username'
|
|
261
261
|
# SMTP password
|
|
262
262
|
SMTP_PASSWORD = 'smtp_password'
|
|
263
|
+
# Time Zone
|
|
264
|
+
TIMEZONE = 'timezone'
|
|
263
265
|
## Minimum TLS Version required for HTTPS connections
|
|
264
266
|
TLS_MIN_VERSION = 'tls_min_version'
|
|
265
267
|
## Maximum TLS Version used for HTTPS connections
|
|
266
268
|
TLS_MAX_VERSION = 'tls_max_version'
|
|
267
|
-
# Time Zone
|
|
268
|
-
TIMEZONE = 'timezone'
|
|
269
269
|
# Clear basic filter when updating an existing sheet
|
|
270
270
|
TODRIVE_CLEARFILTER = 'todrive_clearfilter'
|
|
271
271
|
# Use client access for todrive
|
|
@@ -431,9 +431,9 @@ Defaults = {
|
|
|
431
431
|
SMTP_HOST: '',
|
|
432
432
|
SMTP_USERNAME: '',
|
|
433
433
|
SMTP_PASSWORD: '',
|
|
434
|
+
TIMEZONE: 'utc',
|
|
434
435
|
TLS_MIN_VERSION: 'TLSv1_3',
|
|
435
436
|
TLS_MAX_VERSION: '',
|
|
436
|
-
TIMEZONE: 'utc',
|
|
437
437
|
TODRIVE_CLEARFILTER: FALSE,
|
|
438
438
|
TODRIVE_CLIENTACCESS: FALSE,
|
|
439
439
|
TODRIVE_CONVERSION: TRUE,
|
|
@@ -599,9 +599,9 @@ VAR_INFO = {
|
|
|
599
599
|
SMTP_HOST: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
|
|
600
600
|
SMTP_USERNAME: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
|
|
601
601
|
SMTP_PASSWORD: {VAR_TYPE: TYPE_PASSWORD, VAR_LIMITS: (0, None)},
|
|
602
|
+
TIMEZONE: {VAR_TYPE: TYPE_TIMEZONE},
|
|
602
603
|
TLS_MIN_VERSION: {VAR_TYPE: TYPE_CHOICE, VAR_ENVVAR: 'GAM_TLS_MIN_VERSION', VAR_CHOICES: TLS_CHOICE_MAP},
|
|
603
604
|
TLS_MAX_VERSION: {VAR_TYPE: TYPE_CHOICE, VAR_ENVVAR: 'GAM_TLS_MAX_VERSION', VAR_CHOICES: TLS_CHOICE_MAP},
|
|
604
|
-
TIMEZONE: {VAR_TYPE: TYPE_TIMEZONE},
|
|
605
605
|
TODRIVE_CLEARFILTER: {VAR_TYPE: TYPE_BOOLEAN},
|
|
606
606
|
TODRIVE_CLIENTACCESS: {VAR_TYPE: TYPE_BOOLEAN},
|
|
607
607
|
TODRIVE_CONVERSION: {VAR_TYPE: TYPE_BOOLEAN},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
|
|
3
|
-
# Copyright (C)
|
|
3
|
+
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
|
4
4
|
#
|
|
5
5
|
# All Rights Reserved.
|
|
6
6
|
#
|
|
@@ -25,8 +25,6 @@
|
|
|
25
25
|
# Some commands want to set a non-zero return code but not bail
|
|
26
26
|
# GAM admin user from oauth2.txt or oauth2service.json
|
|
27
27
|
ADMIN = 'admn'
|
|
28
|
-
# Drive service for admin; used to look up Shared Drive Names
|
|
29
|
-
ADMIN_DRIVE = 'addr'
|
|
30
28
|
# Number/length of API call retries
|
|
31
29
|
API_CALLS_RETRY_DATA = 'rtry'
|
|
32
30
|
# GAM cache directory. If no_cache is True, this variable will be set to None
|
|
@@ -220,7 +218,6 @@ REDIRECT_QUEUE_EOF = 'eof'
|
|
|
220
218
|
#
|
|
221
219
|
Globals = {
|
|
222
220
|
ADMIN: None,
|
|
223
|
-
ADMIN_DRIVE: None,
|
|
224
221
|
API_CALLS_RETRY_DATA: {},
|
|
225
222
|
CACHE_DIR: None,
|
|
226
223
|
CACHE_DISCOVERY_ONLY: True,
|
|
@@ -10,6 +10,25 @@ Add the `-s` option to the end of the above commands to suppress creating the `g
|
|
|
10
10
|
|
|
11
11
|
See [Downloads-Installs-GAM7](https://github.com/GAM-team/GAM/wiki/Downloads-Installs) for Windows or other options, including manual installation
|
|
12
12
|
|
|
13
|
+
### 7.07.12
|
|
14
|
+
|
|
15
|
+
Fixed bug in `gam print|show oushareddrives` that caused a trap.
|
|
16
|
+
|
|
17
|
+
Improved getting Shared Drive names from IDs when accessing Shared Drives in external workspaces.
|
|
18
|
+
|
|
19
|
+
### 7.07.11
|
|
20
|
+
|
|
21
|
+
Updated `gam calendars <CalendarEntity> update events` and `gam <UserTypeEntity> update events <UserCalendarEntity>`
|
|
22
|
+
to handle the following error:
|
|
23
|
+
```
|
|
24
|
+
ERROR: 400: badRequest - Bad Request
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Updated `gam <UserTypeEntity> move drivefile` to handle the following error:
|
|
28
|
+
```
|
|
29
|
+
ERROR: 400: shareOutNotPermitted
|
|
30
|
+
```
|
|
31
|
+
|
|
13
32
|
### 7.07.10
|
|
14
33
|
|
|
15
34
|
Updated `gam calendars <CalendarEntity> update events` and `gam <UserTypeEntity> update events <UserCalendarEntity>`
|
|
@@ -335,6 +335,11 @@ gam update group group@domain.com whoCanViewMembership ALL_MEMBERS_CAN_VIEW whoC
|
|
|
335
335
|
Group: group@domain.com, Updated
|
|
336
336
|
```
|
|
337
337
|
|
|
338
|
+
If you are entering a valid combination but an error message is returned, do the following and then re-issue your command.
|
|
339
|
+
```
|
|
340
|
+
gam update group group@domain.com whoCanViewMembership ALL_IN_DOMAIN_CAN_VIEW whoCanDiscoverGroup ALL_IN_DOMAIN_CAN_DISCOVER
|
|
341
|
+
```
|
|
342
|
+
|
|
338
343
|
## Manage groups
|
|
339
344
|
|
|
340
345
|
These commands allow you to create, update and delete groups.
|
|
@@ -251,7 +251,7 @@ writes the credentials into the file oauth2.txt.
|
|
|
251
251
|
admin@server:/Users/admin$ rm -f /Users/admin/GAMConfig/oauth2.txt
|
|
252
252
|
admin@server:/Users/admin$ gam version
|
|
253
253
|
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
|
|
254
|
-
GAM 7.07.
|
|
254
|
+
GAM 7.07.12 - https://github.com/GAM-team/GAM - pyinstaller
|
|
255
255
|
GAM Team <google-apps-manager@googlegroups.com>
|
|
256
256
|
Python 3.13.3 64-bit final
|
|
257
257
|
MacOS Sequoia 15.5 x86_64
|
|
@@ -989,7 +989,7 @@ writes the credentials into the file oauth2.txt.
|
|
|
989
989
|
C:\>del C:\GAMConfig\oauth2.txt
|
|
990
990
|
C:\>gam version
|
|
991
991
|
WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
|
|
992
|
-
GAM 7.07.
|
|
992
|
+
GAM 7.07.12 - https://github.com/GAM-team/GAM - pythonsource
|
|
993
993
|
GAM Team <google-apps-manager@googlegroups.com>
|
|
994
994
|
Python 3.13.3 64-bit final
|
|
995
995
|
Windows-10-10.0.17134 AMD64
|
|
@@ -662,7 +662,7 @@ When moving a folder you can use the `retainsourcefolders` option to cause GAM t
|
|
|
662
662
|
Moving a Drive folder to a Shared Drive is not directly supported by the API; GAM has to make a copy of the folder on the Shared Drive and
|
|
663
663
|
recursively adjust the files/folders within it to point to the new parent folder. Once the original folder is emptied, it is deleted unless `retainsourcefolders` is specified.
|
|
664
664
|
|
|
665
|
-
|
|
665
|
+
## Move content of a Shared Drive to another Shared Drive
|
|
666
666
|
Suppose you have a source Shared Drive with ID 0AC_1AB with multiple files and folders, and want to move all of its content to the target Shared Drive with ID 0AE_9ZX.
|
|
667
667
|
|
|
668
668
|
The following command will change the parents of the top level files and folders from 0AC_1AB to 0AE_9ZX; the sub files and folders will move along with their top level folder.
|
|
@@ -676,3 +676,19 @@ If you want the source Shared Drive with ID 0AC_1AB to be contained in a top lev
|
|
|
676
676
|
```
|
|
677
677
|
gam user user@domain.com move drivefile teamdriveid 0AC_1AB teamdriveparentid 0AE_9ZX
|
|
678
678
|
```
|
|
679
|
+
|
|
680
|
+
### Inter-workspace moves
|
|
681
|
+
Due to a restructuring, you want to move data from Shared Drive A in domaina.com to Shared Drive B in domainb.com.
|
|
682
|
+
* Shared Drive A in domaina.com has the following unchecked: `Allow people outside of Domain A to access files`
|
|
683
|
+
* Shared Drive B in domainb.com has the following checked: `Allow people outside of Domain B to access files`
|
|
684
|
+
* `user@domaina.com` is a manager of both Shared Drives.
|
|
685
|
+
|
|
686
|
+
```
|
|
687
|
+
$ gam user user@domaina move drivefile teamdriveid <SharedDriveAID> teamdriveparentid <SharedDriveBID> mergewithparent
|
|
688
|
+
User: user@domaina.com, Move 1 Drive File/Folder
|
|
689
|
+
User: user@domaina.com, Drive Folder: Shared Drive A(<SharedDriveAID>), Move(Merge) contents with Drive Folder: Shared Drive B(<SharedDriveBID>)
|
|
690
|
+
User: user@domaina.com, Drive File: Filename(<FileID>), Move Failed: Bad Request. User message: "shareOutNotPermitted"
|
|
691
|
+
...
|
|
692
|
+
User: user@domaina.com, Drive Folder: Shared Drive A(<SharedDriveAID>), Retained
|
|
693
|
+
```
|
|
694
|
+
To get this to work, you must check `Allow people outside of Domain A to access files` on Shared Drive A in domaina.com
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Print the current version of Gam with details
|
|
4
4
|
```
|
|
5
5
|
gam version
|
|
6
|
-
GAM 7.07.
|
|
6
|
+
GAM 7.07.12 - https://github.com/GAM-team/GAM - pyinstaller
|
|
7
7
|
GAM Team <google-apps-manager@googlegroups.com>
|
|
8
8
|
Python 3.13.3 64-bit final
|
|
9
9
|
MacOS Sequoia 15.5 x86_64
|
|
@@ -15,7 +15,7 @@ Time: 2023-06-02T21:10:00-07:00
|
|
|
15
15
|
Print the current version of Gam with details and time offset information
|
|
16
16
|
```
|
|
17
17
|
gam version timeoffset
|
|
18
|
-
GAM 7.07.
|
|
18
|
+
GAM 7.07.12 - https://github.com/GAM-team/GAM - pyinstaller
|
|
19
19
|
GAM Team <google-apps-manager@googlegroups.com>
|
|
20
20
|
Python 3.13.3 64-bit final
|
|
21
21
|
MacOS Sequoia 15.5 x86_64
|
|
@@ -27,7 +27,7 @@ Your system time differs from www.googleapis.com by less than 1 second
|
|
|
27
27
|
Print the current version of Gam with extended details and SSL information
|
|
28
28
|
```
|
|
29
29
|
gam version extended
|
|
30
|
-
GAM 7.07.
|
|
30
|
+
GAM 7.07.12 - https://github.com/GAM-team/GAM - pyinstaller
|
|
31
31
|
GAM Team <google-apps-manager@googlegroups.com>
|
|
32
32
|
Python 3.13.3 64-bit final
|
|
33
33
|
MacOS Sequoia 15.5 x86_64
|
|
@@ -64,7 +64,7 @@ MacOS High Sierra 10.13.6 x86_64
|
|
|
64
64
|
Path: /Users/Admin/bin/gam7
|
|
65
65
|
Version Check:
|
|
66
66
|
Current: 5.35.08
|
|
67
|
-
Latest: 7.07.
|
|
67
|
+
Latest: 7.07.12
|
|
68
68
|
echo $?
|
|
69
69
|
1
|
|
70
70
|
```
|
|
@@ -72,7 +72,7 @@ echo $?
|
|
|
72
72
|
Print the current version number without details
|
|
73
73
|
```
|
|
74
74
|
gam version simple
|
|
75
|
-
7.07.
|
|
75
|
+
7.07.12
|
|
76
76
|
```
|
|
77
77
|
In Linux/MacOS you can do:
|
|
78
78
|
```
|
|
@@ -82,7 +82,7 @@ echo $VER
|
|
|
82
82
|
Print the current version of Gam and address of this Wiki
|
|
83
83
|
```
|
|
84
84
|
gam help
|
|
85
|
-
GAM 7.07.
|
|
85
|
+
GAM 7.07.12 - https://github.com/GAM-team/GAM
|
|
86
86
|
GAM Team <google-apps-manager@googlegroups.com>
|
|
87
87
|
Python 3.13.3 64-bit final
|
|
88
88
|
MacOS Sequoia 15.5 x86_64
|