Classroom student groups in general release

This commit is contained in:
Ross Scroggs
2026-01-27 13:38:12 -08:00
parent cfe6376c28
commit 1d531d13e4
2 changed files with 15 additions and 12 deletions

View File

@@ -1,3 +1,7 @@
7.32.04
Support for student groups in Google Classroom no longer requires Developer Preview membership.
7.32.03 7.32.03
Added option `template` as an additional formating option for `gam <UserTypeEntity> show signature` Added option `template` as an additional formating option for `gam <UserTypeEntity> show signature`
@@ -5,7 +9,15 @@ that displays just the HTML data; this simplifies capturing the data for use as
``` ```
$ gam redirect stdout ./SigTemplate.html user user@domain.com show signature template $ gam redirect stdout ./SigTemplate.html user user@domain.com show signature template
$ more SigTemplate.html $ more SigTemplate.html
<div dir="ltr"><div dir="ltr"><div dir="ltr"><p style="margin:0px;font-size-adjust:none;font-stretch:normal;font-size:12px;line-height:normal;font-family:Monaco;color:rgb(0,0,0)"><span style="background-color:rgb(82,208,206)">{RT}Email: {Email}{/RT}</span></p><p style="margin:0px;font-size-adjust:none;font-stretch:normal;font-size:12px;line-height:normal;font-family:Monaco;color:rgb(0,0,0)"><span style="background-color:rgb(82,208,206)">{RT}Phone: {Phone}{/RT}</span></p><p style="margin:0px;font-size-adjust:none;font-stretch:normal;font-size:12px;line-height:normal;font-family:Monaco;color:rgb(0,0,0)"><span style="background-color:rgb(82,208,206)">{RT}Mobile: {Mobile}{/RT}</span></p></div><br></div>\n</div> <div dir="ltr"><div dir="ltr"><div dir="ltr">
<p style="margin:0px;font-size-adjust:none;font-stretch:normal;font-size:12px;line-height:normal;font-family:Monaco;color:rgb(0,0,0)">
<span style="background-color:rgb(82,208,206)">{RT}Email: {Email}{/RT}</span></p>
<p style="margin:0px;font-size-adjust:none;font-stretch:normal;font-size:12px;line-height:normal;font-family:Monaco;color:rgb(0,0,0)">
<span style="background-color:rgb(82,208,206)">{RT}Phone: {Phone}{/RT}</span></p>
<p style="margin:0px;font-size-adjust:none;font-stretch:normal;font-size:12px;line-height:normal;font-family:Monaco;color:rgb(0,0,0)">
<span style="background-color:rgb(82,208,206)">{RT}Mobile: {Mobile}{/RT}</span></p>
</div><br></div>\n</div>
``` ```
7.32.02 7.32.02

View File

@@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
""" """
__author__ = 'GAM Team <google-apps-manager@googlegroups.com>' __author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
__version__ = '7.32.03' __version__ = '7.32.04'
__license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)' __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
# pylint: disable=wrong-import-position # pylint: disable=wrong-import-position
@@ -4820,7 +4820,7 @@ def getService(api, httpObj):
triesLimit = 3 triesLimit = 3
for n in range(1, triesLimit+1): for n in range(1, triesLimit+1):
try: try:
if api not in {API.CHAT, API.CLASSROOM} or not GC.Values[GC.DEVELOPER_PREVIEW_API_KEY]: if api not in {API.CHAT} or not GC.Values[GC.DEVELOPER_PREVIEW_API_KEY]:
discoveryServiceUrl = DISCOVERY_URIS[v2discovery] discoveryServiceUrl = DISCOVERY_URIS[v2discovery]
else: else:
discoveryServiceUrl = DEVELOPER_PREVIEW_DISCOVERY_URI discoveryServiceUrl = DEVELOPER_PREVIEW_DISCOVERY_URI
@@ -52846,7 +52846,6 @@ def doCreateCourseStudentGroups():
throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED, throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED,
GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED], GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
previewVersion='V1_20250630_PREVIEW',
**kwargs) **kwargs)
kvList[-1] = f"{studentGroup['title']}({studentGroup['id']})" kvList[-1] = f"{studentGroup['title']}({studentGroup['id']})"
if not csvPF: if not csvPF:
@@ -52893,7 +52892,6 @@ def doUpdateCourseStudentGroups():
throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED, throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED,
GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED], GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
previewVersion='V1_20250630_PREVIEW',
**kwargs) **kwargs)
kvList[-1] = f"{studentGroup['title']}({studentGroup['id']})" kvList[-1] = f"{studentGroup['title']}({studentGroup['id']})"
entityActionPerformed(kvList) entityActionPerformed(kvList)
@@ -52927,7 +52925,6 @@ def doDeleteCourseStudentGroups():
throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED, throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED,
GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED], GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
previewVersion='V1_20250630_PREVIEW',
**kwargs) **kwargs)
entityActionPerformed(kvList, i, count) entityActionPerformed(kvList, i, count)
except GAPI.notFound as e: except GAPI.notFound as e:
@@ -52972,7 +52969,6 @@ def doClearCourseStudentGroups():
throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED, throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED,
GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED], GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
previewVersion='V1_20250630_PREVIEW',
courseId=courseId) courseId=courseId)
except GAPI.notFound as e: except GAPI.notFound as e:
entityActionFailedWarning([Ent.COURSE, courseId], str(e)) entityActionFailedWarning([Ent.COURSE, courseId], str(e))
@@ -52993,7 +52989,6 @@ def doClearCourseStudentGroups():
throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED, throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED,
GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED], GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
previewVersion='V1_20250630_PREVIEW',
**kwargs) **kwargs)
entityActionPerformed(kvList, j, jcount) entityActionPerformed(kvList, j, jcount)
except GAPI.notFound as e: except GAPI.notFound as e:
@@ -53067,7 +53062,6 @@ def doPrintCourseStudentGroups(showMembers=False):
throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED, throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED,
GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED], GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
previewVersion='V1_20250630_PREVIEW',
courseId=courseId) courseId=courseId)
except GAPI.notFound as e: except GAPI.notFound as e:
entityActionFailedWarning([Ent.COURSE, courseId], str(e)) entityActionFailedWarning([Ent.COURSE, courseId], str(e))
@@ -53102,7 +53096,6 @@ def doPrintCourseStudentGroups(showMembers=False):
throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE,
GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED], GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
previewVersion='V1_20250630_PREVIEW',
courseId=courseId, studentGroupId=studentGroupId) courseId=courseId, studentGroupId=studentGroupId)
if showItemCountOnly: if showItemCountOnly:
itemCount += len(students) itemCount += len(students)
@@ -53170,7 +53163,6 @@ def doProcessCourseStudentGroupMembers():
throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE, throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE,
GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED], GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
previewVersion='V1_20250630_PREVIEW',
courseId=courseId, studentGroupId=studentGroupId) courseId=courseId, studentGroupId=studentGroupId)
except GAPI.notFound as e: except GAPI.notFound as e:
entityActionFailedWarning([Ent.COURSE, courseId, Ent.COURSE_STUDENTGROUP, studentGroupId], str(e)) entityActionFailedWarning([Ent.COURSE, courseId, Ent.COURSE_STUDENTGROUP, studentGroupId], str(e))
@@ -53206,7 +53198,6 @@ def doProcessCourseStudentGroupMembers():
GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED, GAPI.SERVICE_NOT_AVAILABLE, GAPI.NOT_IMPLEMENTED,
GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED], GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
previewVersion='V1_20250630_PREVIEW',
**kwargs) **kwargs)
entityActionPerformed(kvList, i, count) entityActionPerformed(kvList, i, count)
except (GAPI.alreadyExists, GAPI.notFound) as e: except (GAPI.alreadyExists, GAPI.notFound) as e: