--- loncom/interface/lonparmset.pm 2007/09/03 15:34:12 1.379 +++ loncom/interface/lonparmset.pm 2007/09/11 01:59:30 1.381 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.379 2007/09/03 15:34:12 raeburn Exp $ +# $Id: lonparmset.pm,v 1.381 2007/09/11 01:59:30 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -2582,6 +2582,26 @@ sub extractuser { return ($key=~/^$env{'request.course.id'}.\[useropt\:($match_username)\:($match_domain)\]\./); } +sub parse_listdata_key { + my ($key,$listdata) = @_; + # split into student/section affected, and + # the realm (folder/resource part and parameter + my ($student,$realm) = + ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/); + # if course wide student would be undefined + if (!defined($student)) { + ($realm)=($key=~/^\Q$env{'request.course.id'}\E\.(.+)$/); + } + # strip off the .type if it's not the Question type parameter + if ($realm=~/\.type$/ && !exists($listdata->{$key.'.type'})) { + $realm=~s/\.type//; + } + # split into resource+part and parameter name + my ($res, $parm) = ($realm=~/^(.*)\.(.*)$/); + my ($res, $part) = ($res =~/^(.*)\.(.*)$/); + return ($student,$res,$part,$parm); +} + sub listdata { my ($r,$resourcedata,$listdata,$sortorder)=@_; # Start list output @@ -2593,40 +2613,48 @@ sub listdata { $tableopen=0; my $foundkeys=0; my %keyorder=&standardkeyorder(); + foreach my $thiskey (sort { + my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata); + my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata); + + # get the numerical order for the param + $aparm=$keyorder{'parameter_0_'.$aparm}; + $bparm=$keyorder{'parameter_0_'.$bparm}; + + my $result=0; + if ($sortorder eq 'realmstudent') { - my ($astudent,$arealm)=($a=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/); - my ($bstudent,$brealm)=($b=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/); - if (!defined($astudent)) { - ($arealm)=($a=~/^\Q$env{'request.course.id'}\E\.(.+)$/); - } - if (!defined($bstudent)) { - ($brealm)=($b=~/^\Q$env{'request.course.id'}\E\.(.+)$/); - } - $arealm=~s/\.type//; - my ($ares, $aparm) = ($arealm=~/^(.*)\.(.*)$/); - $aparm=$keyorder{'parameter_0_'.$aparm}; - $brealm=~s/\.type//; - my ($bres, $bparm) = ($brealm=~/^(.*)\.(.*)$/); - $bparm=$keyorder{'parameter_0_'.$bparm}; - if ($ares eq $bres) { - if (defined($aparm) && defined($bparm)) { - ($aparm <=> $bparm); - } elsif (defined($aparm)) { - -1; - } elsif (defined($bparm)) { - 1; - } else { - ($arealm cmp $brealm) || ($astudent cmp $bstudent); - } - } else { - ($arealm cmp $brealm) || ($astudent cmp $bstudent); + if ($ares ne $bres ) { + $result = ($ares cmp $bres); + } elsif ($astudent ne $bstudent) { + $result = ($astudent cmp $bstudent); + } elsif ($apart ne $bpart ) { + $result = ($apart cmp $bpart); } } else { - $a cmp $b; + if ($astudent ne $bstudent) { + $result = ($astudent cmp $bstudent); + } elsif ($ares ne $bres ) { + $result = ($ares cmp $bres); + } elsif ($apart ne $bpart ) { + $result = ($apart cmp $bpart); + } + } + + if (!$result) { + if (defined($aparm) && defined($bparm)) { + $result = ($aparm <=> $bparm); + } elsif (defined($aparm)) { + $result = -1; + } elsif (defined($bparm)) { + $result = 1; + } } + + $result; } keys %{$listdata}) { - + if ($$listdata{$thiskey.'.type'}) { my $thistype=$$listdata{$thiskey.'.type'}; if ($$resourcedata{$thiskey.'.type'}) { @@ -3082,14 +3110,14 @@ where $action is add or drop, and $clone user for whom cloning ability is to be changed in course. =cut - + ################################################## ################################################## sub extract_cloners { my ($clonelist,$allowclone) = @_; if ($clonelist =~ /,/) { - @{$allowclone} = split/,/,$clonelist; + @{$allowclone} = split(/,/,$clonelist); } else { $$allowclone[0] = $clonelist; } @@ -3101,15 +3129,14 @@ sub check_cloners { my @allowclone = (); &extract_cloners($$clonelist,\@allowclone); foreach my $currclone (@allowclone) { - if (!grep/^\Q$currclone\E$/,@$oldcloner) { + if (!grep(/^\Q$currclone\E$/,@$oldcloner)) { if ($currclone eq '*') { $clean_clonelist .= $currclone.','; } else { my ($uname,$udom) = split(/:/,$currclone); if ($uname eq '*') { if ($udom =~ /^$match_domain$/) { - my @alldoms = &Apache::lonnet::all_domains(); - if (!grep(/^\Q$udom\E$/,@alldoms)) { + if (!&Apache::lonnet::domain($udom)) { $disallowed{'domain'} .= $currclone.','; } else { $clean_clonelist .= $currclone.','; @@ -3152,9 +3179,9 @@ sub change_clone { my @allowclone; &extract_cloners($clonelist,\@allowclone); foreach my $currclone (@allowclone) { - if (!grep/^$currclone$/,@$oldcloner) { + if (!grep(/^$currclone$/,@$oldcloner)) { if ($currclone ne '*') { - ($uname,$udom) = split/:/,$currclone; + ($uname,$udom) = split(/:/,$currclone); if ($uname && $udom && $uname ne '*') { if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') { my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable'); @@ -3172,9 +3199,9 @@ sub change_clone { } } foreach my $oldclone (@$oldcloner) { - if (!grep/^$oldclone$/,@allowclone) { + if (!grep(/^\Q$oldclone\E$/,@allowclone)) { if ($oldclone ne '*') { - ($uname,$udom) = split/:/,$oldclone; + ($uname,$udom) = split(/:/,$oldclone); if ($uname && $udom && $uname ne '*' ) { if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') { my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');