def getGroups(roster): """ Returns a list of Group objects from Canvas based on the Group Set name in the configuration file. If no such group set exists or if an individual is not part of a group, they are placed in a group of one. In addition, each Person object in the given roster is associated with its group. """ groups = [] if config.gradingGroupName is not None: groupData = getGroupTuples(config.gradingGroupName) for gd in groupData: #(groupId,"groupName",[membersCanvasIds]) g = Group(gd[0], gd[1]) members = [] for memberCanvasId in gd[2]: for nuid, p in roster.items(): if p.canvasId == memberCanvasId: members.append(p) p.group = g break g.addMembers(members) groups.append(g) # iterate through roster and create groups of one: for nuid, p in roster.items(): # but only if they have not already been assigned to a group if p.group is None: g = Group() g.addMembers([p]) p.group = g groups.append(g) return groups
def __init__(self, instructorNuids = [], graderNuids = []): self.instructorNuids = instructorNuids self.graderNuids = graderNuids # 1a. load full roster from canvas self.roster = roster # 2. get as many cse logins as possible # 2a. dump NUIDs to map nuids = [p.nuid for p in self.roster] nuidsToCseLogins = dict(zip(nuids, [None for x in nuids])) # 2b. update nuidsToCseLogins = udb.mapNuidsToCseLogins(nuidsToCseLogins,config.nuidToCseLoginPickle) # 2c. update roster instances for p in self.roster: if p.nuid in nuidsToCseLogins and nuidsToCseLogins[p.nuid] is not None: p.cseLogin = nuidsToCseLogins[p.nuid] #3. filter into the appropriate group # This is done manually as the "role" is not available from canvas # using the canvas API and we want more fine-grained control anyway # - If there is no cse login, they are ignored # - Otherwise, they are either a student XOR instructor/grader # - instructors can be graders for p in self.roster: if p.cseLogin is None: self.orphans[p.nuid] = p else: if p.nuid in instructorNuids or p.nuid in graderNuids: if p.nuid in instructorNuids: self.instructors[p.nuid] = p if p.nuid in graderNuids: self.graders[p.nuid] = p else: self.students[p.nuid] = p #4. Update the groups so that every student is in a group # For those in a canvas group of 2 or more or in their # own "group of one" # self.groups data model: # [(groupId, 'Group Name', [canvasIds])] canvasGroups = groups self.groups = [] for group in canvasGroups: #canvasGroupId, canvasGroupname g = Group(group[0], group[1]) members = [] for memberCanvasId in group[2]: for p in self.roster: if p.canvasId == memberCanvasId: members.append(p) p.group = g; break g.addMembers(members) self.groups.append(g) # iterate through students and create "group of one" for nuid,s in self.students.items(): if s.group is None: g = Group() g.addMembers([s]) s.group = g self.groups.append(g)