Enhance print courses/course-participants (#413)

This commit is contained in:
Ross Scroggs
2017-02-01 06:09:02 -08:00
committed by Jay Lee
parent 082cd9b087
commit c279acbab8
2 changed files with 155 additions and 45 deletions

View File

@ -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>

View File

@ -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():