Exemple #1
0
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)