mirror of
https://github.com/GAM-team/GAM.git
synced 2025-07-10 06:33:34 +00:00
Enhance print courses/course-participants (#413)
This commit is contained in:
@ -128,6 +128,25 @@ Named items
|
||||
<URL> ::= <String>
|
||||
<UserItem> ::= <EmailAddress>|<UniqueID>|<String>
|
||||
|
||||
<CourseFieldName> ::=
|
||||
alternatelink|
|
||||
coursegroupemail|
|
||||
coursematerialsets|
|
||||
coursestate|
|
||||
creationtime|
|
||||
description|
|
||||
descriptionheading|
|
||||
enrollmentcode|
|
||||
guardiansenabled|
|
||||
id|
|
||||
name|
|
||||
ownerid|
|
||||
room|
|
||||
section|
|
||||
teacherfolder|
|
||||
teachergroupemail|
|
||||
updatetime
|
||||
<CourseFieldNameList> ::= '<CourseFieldName>(,<CourseFieldName>)*'
|
||||
|
||||
<CrOSFieldName> ::=
|
||||
activetimeranges|timeranges|
|
||||
@ -644,6 +663,7 @@ gam update course <CourseID> <CourseAttributes>+
|
||||
gam delete course <CourseID>
|
||||
gam info course <CourseID>
|
||||
gam print courses [todrive] [teacher <UserItem>] [student <UserItem>] [alias|aliases] [delimiter <String>]
|
||||
[show all|students|teachers] [fields <CourseFieldNameList>] [skipfields <CourseFieldNameList>]
|
||||
|
||||
gam course <CourseID> add alias <CourseAlias>
|
||||
gam course <CourseID> delete alias <CourseAlias>
|
||||
|
174
src/gam.py
174
src/gam.py
@ -1957,15 +1957,76 @@ def doGetCourseInfo():
|
||||
except KeyError:
|
||||
print utils.convertUTF8(u' %s' % student[u'profile'][u'name'][u'fullName'])
|
||||
|
||||
COURSE_ARGUMENT_TO_PROPERTY_MAP = {
|
||||
u'alternatelink': u'alternateLink',
|
||||
u'coursegroupemail': u'courseGroupEmail',
|
||||
u'coursematerialsets': u'courseMaterialSets',
|
||||
u'coursestate': u'courseState',
|
||||
u'creationtime': u'creationTime',
|
||||
u'description': u'description',
|
||||
u'descriptionheading': u'descriptionHeading',
|
||||
u'enrollmentcode': u'enrollmentCode',
|
||||
u'guardiansenabled': u'guardiansEnabled',
|
||||
u'id': u'id',
|
||||
u'name': u'name',
|
||||
u'ownerid': u'ownerId',
|
||||
u'room': u'room',
|
||||
u'section': u'section',
|
||||
u'teacherfolder': u'teacherFolder',
|
||||
u'teachergroupemail': u'teacherGroupEmail',
|
||||
u'updatetime': u'updateTime',
|
||||
}
|
||||
|
||||
def doPrintCourses():
|
||||
|
||||
def _processFieldsList(myarg, i, fList):
|
||||
fieldNameList = sys.argv[i+1]
|
||||
for field in fieldNameList.lower().replace(u',', u' ').split():
|
||||
if field in COURSE_ARGUMENT_TO_PROPERTY_MAP:
|
||||
if field != u'id':
|
||||
fList.append(COURSE_ARGUMENT_TO_PROPERTY_MAP[field])
|
||||
else:
|
||||
print u'ERROR: %s is not a valid argument for "gam print courses %s"' % (field, myarg)
|
||||
sys.exit(2)
|
||||
|
||||
def _saveParticipants(course, participants, role):
|
||||
jcount = len(participants)
|
||||
course[role] = jcount
|
||||
addTitlesToCSVfile([role], titles)
|
||||
j = 0
|
||||
for member in participants:
|
||||
memberTitles = []
|
||||
prefix = u'{0}.{1}.'.format(role, j)
|
||||
profile = member[u'profile']
|
||||
emailAddress = profile.get(u'emailAddress')
|
||||
if emailAddress:
|
||||
memberTitle = prefix+u'emailAddress'
|
||||
course[memberTitle] = emailAddress
|
||||
memberTitles.append(memberTitle)
|
||||
memberId = profile.get(u'id')
|
||||
if memberId:
|
||||
memberTitle = prefix+u'id'
|
||||
course[memberTitle] = memberId
|
||||
memberTitles.append(memberTitle)
|
||||
fullName = profile.get(u'name', {}).get(u'fullName')
|
||||
if fullName:
|
||||
memberTitle = prefix+u'name.fullName'
|
||||
course[memberTitle] = fullName
|
||||
memberTitles.append(memberTitle)
|
||||
addTitlesToCSVfile(memberTitles, titles)
|
||||
j += 1
|
||||
|
||||
croom = buildGAPIObject(u'classroom')
|
||||
todrive = False
|
||||
fieldsList = []
|
||||
skipFieldsList = []
|
||||
titles = [u'id',]
|
||||
csvRows = []
|
||||
teacherId = None
|
||||
studentId = None
|
||||
get_aliases = False
|
||||
aliasesDelimiter = u' '
|
||||
showAliases = False
|
||||
delimiter = u' '
|
||||
showMembers = u''
|
||||
i = 3
|
||||
while i < len(sys.argv):
|
||||
myarg = sys.argv[i].lower()
|
||||
@ -1979,31 +2040,64 @@ def doPrintCourses():
|
||||
todrive = True
|
||||
i += 1
|
||||
elif myarg in [u'alias', u'aliases']:
|
||||
get_aliases = True
|
||||
showAliases = True
|
||||
i += 1
|
||||
elif myarg == u'delimiter':
|
||||
aliasesDelimiter = sys.argv[i+1]
|
||||
delimiter = sys.argv[i+1]
|
||||
i += 2
|
||||
elif myarg == u'show':
|
||||
showMembers = sys.argv[i+1].lower()
|
||||
if showMembers not in [u'all', u'students', u'teachers']:
|
||||
print u'ERROR: show must be all, students or teachers; got %s' % showMembers
|
||||
sys.exit(2)
|
||||
i += 2
|
||||
elif myarg == u'fields':
|
||||
if not fieldsList:
|
||||
fieldsList = [u'id',]
|
||||
_processFieldsList(myarg, i, fieldsList)
|
||||
i += 2
|
||||
elif myarg == u'skipfields':
|
||||
_processFieldsList(myarg, i, skipFieldsList)
|
||||
i += 2
|
||||
else:
|
||||
print u'ERROR: %s is not a valid argument for "gam print courses"' % sys.argv[i]
|
||||
sys.exit(2)
|
||||
fields = u'nextPageToken,courses({0})'.format(u','.join(set(fieldsList))) if fieldsList else None
|
||||
sys.stderr.write(u'Retrieving courses for organization (may take some time for large accounts)...\n')
|
||||
page_message = u'Got %%num_items%% courses...\n'
|
||||
all_courses = callGAPIpages(croom.courses(), u'list', u'courses', page_message=page_message, teacherId=teacherId, studentId=studentId)
|
||||
all_courses = callGAPIpages(croom.courses(), u'list', u'courses', page_message=page_message, teacherId=teacherId, studentId=studentId, fields=fields)
|
||||
for course in all_courses:
|
||||
for field in skipFieldsList:
|
||||
course.pop(field, None)
|
||||
addRowTitlesToCSVfile(flatten_json(course), csvRows, titles)
|
||||
if get_aliases:
|
||||
if showAliases or showMembers:
|
||||
if showAliases:
|
||||
titles.append(u'Aliases')
|
||||
i = 0
|
||||
num_courses = len(csvRows)
|
||||
count = len(csvRows)
|
||||
for course in csvRows:
|
||||
i += 1
|
||||
sys.stderr.write(u'Getting aliases for course %s (%s/%s)\n' % (course[u'id'], i, num_courses))
|
||||
course_aliases = callGAPIpages(croom.courses().aliases(), u'list', u'aliases', courseId=course[u'id'])
|
||||
my_aliases = []
|
||||
for alias in course_aliases:
|
||||
my_aliases.append(alias[u'alias'][2:])
|
||||
course.update(Aliases=aliasesDelimiter.join(my_aliases))
|
||||
courseId = course[u'id']
|
||||
if showAliases:
|
||||
alias_message = u' got %%%%num_items%%%% aliases for course %s%s' % (courseId, currentCount(i, count))
|
||||
course_aliases = callGAPIpages(croom.courses().aliases(), u'list', u'aliases',
|
||||
page_message=alias_message,
|
||||
courseId=courseId)
|
||||
course[u'Aliases'] = delimiter.join([alias[u'alias'][2:] for alias in course_aliases])
|
||||
if showMembers:
|
||||
if showMembers != u'students':
|
||||
teacher_message = u' got %%%%num_items%%%% teachers for course %s%s' % (courseId, currentCount(i, count))
|
||||
results = callGAPIpages(croom.courses().teachers(), u'list', u'teachers',
|
||||
page_message=teacher_message,
|
||||
courseId=courseId, fields=u'nextPageToken,teachers(profile)')
|
||||
_saveParticipants(course, results, u'teachers')
|
||||
if showMembers != u'teachers':
|
||||
student_message = u' got %%%%num_items%%%% students for course %s%s' % (courseId, currentCount(i, count))
|
||||
results = callGAPIpages(croom.courses().students(), u'list', u'students',
|
||||
page_message=student_message,
|
||||
courseId=courseId, fields=u'nextPageToken,students(profile)')
|
||||
_saveParticipants(course, results, u'students')
|
||||
sortCSVTitles([u'id', u'name'], titles)
|
||||
writeCSVfile(csvRows, titles, u'Courses', todrive)
|
||||
|
||||
def doPrintCourseParticipants():
|
||||
@ -2014,23 +2108,31 @@ def doPrintCourseParticipants():
|
||||
courses = []
|
||||
teacherId = None
|
||||
studentId = None
|
||||
showMembers = u'all'
|
||||
i = 3
|
||||
while i < len(sys.argv):
|
||||
if sys.argv[i].lower() in [u'course', u'class']:
|
||||
myarg = sys.argv[i].lower()
|
||||
if myarg in [u'course', u'class']:
|
||||
course = sys.argv[i+1]
|
||||
if not course.isdigit():
|
||||
course = u'd:%s' % course
|
||||
courses.append(course)
|
||||
i += 2
|
||||
elif sys.argv[i].lower() == u'teacher':
|
||||
elif myarg == u'teacher':
|
||||
teacherId = sys.argv[i+1]
|
||||
i += 2
|
||||
elif sys.argv[i].lower() == u'student':
|
||||
elif myarg == u'student':
|
||||
studentId = sys.argv[i+1]
|
||||
i += 2
|
||||
elif sys.argv[i].lower() == u'todrive':
|
||||
elif myarg == u'todrive':
|
||||
todrive = True
|
||||
i += 1
|
||||
elif myarg == u'show':
|
||||
showMembers = sys.argv[i+1].lower()
|
||||
if showMembers not in [u'all', u'students', u'teachers']:
|
||||
print u'ERROR: show must be all, students or teachers; got %s' % showMembers
|
||||
sys.exit(2)
|
||||
i += 2
|
||||
else:
|
||||
print u'ERROR: %s is not a valid argument for "gam print course-participants"' % sys.argv[i]
|
||||
sys.exit(2)
|
||||
@ -2044,33 +2146,21 @@ def doPrintCourseParticipants():
|
||||
all_courses = []
|
||||
for course in courses:
|
||||
all_courses.append(callGAPI(croom.courses(), u'get', id=course))
|
||||
y = 1
|
||||
num_courses = len(all_courses)
|
||||
i = 0
|
||||
count = len(all_courses)
|
||||
for course in all_courses:
|
||||
course_id = course[u'id']
|
||||
teacher_message = u' got %%%%num_items%%%% teachers for course %s (%s/%s)' % (course_id, y, num_courses)
|
||||
student_message = u' got %%%%num_items%%%% students for course %s (%s/%s)' % (course_id, y, num_courses)
|
||||
teachers = callGAPIpages(croom.courses().teachers(), u'list', u'teachers', page_message=teacher_message, courseId=course_id)
|
||||
students = callGAPIpages(croom.courses().students(), u'list', u'students', page_message=student_message, courseId=course_id)
|
||||
i += 1
|
||||
courseId = course[u'id']
|
||||
if showMembers != u'students':
|
||||
page_message = u' got %%%%num_items%%%% teachers for course %s (%s/%s)' % (courseId, i, count)
|
||||
teachers = callGAPIpages(croom.courses().teachers(), u'list', u'teachers', page_message=page_message, courseId=courseId)
|
||||
for teacher in teachers:
|
||||
participant = flatten_json(teacher)
|
||||
participant[u'courseId'] = course_id
|
||||
participant[u'courseName'] = course[u'name']
|
||||
participant[u'userRole'] = u'TEACHER'
|
||||
csvRows.append(participant)
|
||||
for item in participant:
|
||||
if item not in titles:
|
||||
titles.append(item)
|
||||
addRowTitlesToCSVfile(flatten_json(teacher, flattened={u'courseId': courseId, u'courseName': course[u'name'], u'userRole': u'TEACHER'}), csvRows, titles)
|
||||
if showMembers != u'teachers':
|
||||
page_message = u' got %%%%num_items%%%% students for course %s (%s/%s)' % (courseId, i, count)
|
||||
students = callGAPIpages(croom.courses().students(), u'list', u'students', page_message=page_message, courseId=courseId)
|
||||
for student in students:
|
||||
participant = flatten_json(student)
|
||||
participant[u'courseId'] = course_id
|
||||
participant[u'courseName'] = course[u'name']
|
||||
participant[u'userRole'] = u'STUDENT'
|
||||
csvRows.append(participant)
|
||||
for item in participant:
|
||||
if item not in titles:
|
||||
titles.append(item)
|
||||
y += 1
|
||||
addRowTitlesToCSVfile(flatten_json(student, flattened={u'courseId': courseId, u'courseName': course[u'name'], u'userRole': u'STUDENT'}), csvRows, titles)
|
||||
writeCSVfile(csvRows, titles, u'Course Participants', todrive)
|
||||
|
||||
def doPrintPrintJobs():
|
||||
@ -7166,7 +7256,7 @@ def _getResoldCustomerAttr(arg):
|
||||
sys.exit(3)
|
||||
i += 2
|
||||
if not body[u'postalAddress']:
|
||||
del(body[u'postalAddress'])
|
||||
del body[u'postalAddress']
|
||||
return customerAuthToken, body
|
||||
|
||||
def doUpdateResoldCustomer():
|
||||
|
Reference in New Issue
Block a user