make Group->getUsers fully recursive to remove duplicate code

This commit is contained in:
Colin Kuskie 2006-04-13 21:22:04 +00:00
parent e262da13f8
commit be7a44d4f2

View file

@ -646,7 +646,7 @@ sub getGroupsIn {
if ($isRecursive) { if ($isRecursive) {
$loopCount++; $loopCount++;
if ($loopCount > 99) { if ($loopCount > 99) {
$self->session->errorHandler->fatal("Endless recursive loop detected while determining". " groups in group.\nRequested groupId: ".$self->getId."\nGroups in that group: ".join(",",@$groups)); $self->session->errorHandler->fatal("Endless recursive loop detected while determining groups in group.\nRequested groupId: ".$self->getId."\nGroups in that group: ".join(",",@$groups));
} }
my @groupsOfGroups = @$groups; my @groupsOfGroups = @$groups;
foreach my $group (@$groups) { foreach my $group (@$groups) {
@ -684,43 +684,32 @@ sub getUsers {
my $self = shift; my $self = shift;
my $recursive = shift; my $recursive = shift;
my $withoutExpired = shift; my $withoutExpired = shift;
my $clause; my $loopCount = shift;
my @externalUsers = (); my $expireTime = 0;
if ($withoutExpired) { if ($withoutExpired) {
$clause = "expireDate > ".$self->session->datetime->time()." and "; $expireTime = $self->session->datetime->time();
} }
$clause .= "(groupId=".$self->session->db->quote($self->getId); my @users = $self->session->db->buildArray("select userId from groupings where expireDate > ? and groupId = ?", [$expireTime, $self->getId]);
if ($recursive) { push @users,
my $groups = $self->getGroupsIn(1);
if ($#$groups >= 0) {
if ($withoutExpired) {
foreach my $groupId (@$groups) {
$clause .= " OR (groupId = ".$self->session->db->quote($groupId)." AND expireDate > ".$self->session->datetime->time().") ";
}
} else {
$clause .= " OR groupId IN (".$self->session->db->quoteAndJoin($groups).")";
}
}
##Have to iterate twice due to the withoutExpired clause.
foreach my $groupId (@{ $groups }) {
my $extGroup = WebGUI::Group->new($self->session, $groupId);
push @externalUsers,
@{ $extGroup->getDatabaseUsers() },
@{ $extGroup->getKarmaUsers() },
@{ $extGroup->getScratchUsers() },
@{ $extGroup->getIpUsers() },
;
}
}
$clause .= ")";
my @localUsers = $self->session->db->buildArray("select userId from groupings where $clause");
push @externalUsers,
@{ $self->getDatabaseUsers() }, @{ $self->getDatabaseUsers() },
@{ $self->getKarmaUsers() }, @{ $self->getKarmaUsers() },
@{ $self->getScratchUsers() }, @{ $self->getScratchUsers() },
@{ $self->getIpUsers() }, @{ $self->getIpUsers() },
; ;
my @users = ( @localUsers, @externalUsers ); if ($recursive) {
++$loopCount;
if ($loopCount > 99) {
$self->session->errorHandler->fatal("Endless recursive loop detected while determining groups in group.\nRequested groupId: ".$self->getId);
}
my $groups = $self->getGroupsIn();
##Have to iterate twice due to the withoutExpired clause.
foreach my $groupId (@{ $groups }) {
my $subGroup = WebGUI::Group->new($self->session, $groupId);
push @users, @{ $subGroup->getUsers(1, $withoutExpired, $loopCount) };
}
}
my %users = map { $_ => 1 } @users;
@users = keys %users;
return \@users; return \@users;
} }