def _get_current_members(self, group): (members, invalid_members, member_groups) = get_effective_members(group.group_id, act_as=group.added_by) self._reconcile_member_groups(group, member_groups) for member in invalid_members: self.logger.info("Skip group member %s (%s)" % (member.name, member.error)) current_members = [] for member in members: login_id = member.name if member.is_uwnetid(): user_id = member.name elif member.is_eppn(): user_id = valid_gmail_id(member.name) else: continue # Skip members already in academic course sections, removing # from -group section enrollments = self.cached_course_enrollments[group.course_id] match = next( (m for m in enrollments if (m.login_id is not None and m.login_id.lower() == login_id.lower())), None ) if match: self.logger.info("Skip group member %s (present in %s)" % (member.name, match.sis_section_id)) continue course_member = CourseMember( course_id=group.course_id, name=user_id, member_type=member.member_type, role=group.role ) course_member.login = login_id current_members.append(course_member) return current_members
def get(self, request, *args, **kwargs): try: param = kwargs['group_id'] if re.match(r'^\d+$', param): # Existing group group = Group.objects.get(id=param, is_deleted=None) group_id = group.group_id act_as = group.added_by else: group_id = param act_as = self.actas_from_request(request) (valid_members, invalid_members, member_group_ids) = get_effective_members(group_id, act_as=act_as) return self.json_response({ "membership": [member.name for member in valid_members], "invalid": [member.name for member in invalid_members] }) except (GroupPolicyException, GroupUnauthorizedException) as err: return self.error_response(403, err) except (Group.DoesNotExist, GroupNotFoundException): return self.error_response(404, 'UW Group not found') except GWSDispatchException: return self.error_response(401, 'Unauthorized request') except DataFailureException as err: return self.error_response(500, err.msg) except Exception as err: return self.error_response(404, err)
def _update_group_member_group(self, group, member_group, is_deleted): try: # validity is confirmed by act_as (valid, invalid, member_groups) = get_effective_members( member_group, act_as=group.added_by) except GroupNotFoundException as err: GroupMemberGroupModel.objects \ .filter(group_id=member_group) \ .update(is_deleted=True) self._log.info("%s REMOVED member group %s not in %s" % ( log_prefix, member_group, group.group_id)) return except (GroupPolicyException, GroupUnauthorizedException) as err: self._log.info('%s IGNORE %s: %s' % ( log_prefix, group.group_id, err)) return for member in valid: self._update_group_member(group, member, is_deleted) for mg in [member_group] + member_groups: (gmg, created) = GroupMemberGroupModel.objects.get_or_create( group_id=mg, root_group_id=group.group_id) gmg.is_deleted = is_deleted gmg.save()
def all_group_memberships(self, course_id): current_members = set() for group in Group.objects.get_active_by_course(course_id): try: (members, invalid_members, member_groups) = get_effective_members(group.group_id, act_as=group.added_by) self._reconcile_member_groups(group, member_groups) for member in invalid_members: self.logger.info("Skip group member {} ({})".format( member.name, member.error)) for member in members: current_members.add(SetMember(member.name, group.role)) # Skip on any group policy exception except GroupPolicyException as err: self.logger.info("Skip group {} ({})".format( group.group_id, err)) return current_members
def get(self, request, *args, **kwargs): try: group_id = kwargs['group_id'] self.set_actas(request) (valid_members, invalid_members, member_group_ids) = get_effective_members(group_id, act_as=self._actas) return self.json_response({ "membership": [member.name for member in valid_members], "invalid": [member.name for member in invalid_members] }) except (GroupPolicyException, GroupUnauthorizedException) as err: return self.error_response(403, str(err)) except GroupNotFoundException as err: return self.error_response(404, str(err)) except GWSDispatchException: return self.error_response(401, "Unauthorized request") except DataFailureException as err: return self.error_response(500, str(err.msg)) except Exception as err: return self.error_response(404, str(err))