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
Example #5
0
    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))