--- loncom/interface/lonparmset.pm 2005/09/28 13:29:17 1.252 +++ loncom/interface/lonparmset.pm 2006/03/04 22:17:36 1.277 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.252 2005/09/28 13:29:17 banghart Exp $ +# $Id: lonparmset.pm,v 1.277 2006/03/04 22:17:36 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -88,16 +88,19 @@ Inputs: $what - a parameter spec (inclu $id - a bighash Id number $def - the resource's default value 'stupid emacs -Returns: A list, the first item is the index into the remaining list of items of parm valuse that is the active one, the list consists of parm values at the 11 possible levels +Returns: A list, the first item is the index into the remaining list of items of parm valuse that is the active one, the list consists of parm values at the 14 possible levels -11 - General Course -10 - Map or Folder level in course -9- resource default -8- map default -7 - resource level in course -6 - General for section -5 - Map or Folder level for section -4 - resource level in section +14 - General Course +13 - Map or Folder level in course +12- resource default +11- map default +10 - resource level in course +9 - General for section +8 - Map or Folder level for section +7 - resource level in section +6 - General for group +5 - Map or Folder level for group +4 - resource level in group 3 - General for specific student 2 - Map or Folder level for specific student 1 - resource level for specific student @@ -106,21 +109,18 @@ Returns: A list, the first item is the ################################################## sub parmval { - my ($what,$id,$def,$uname,$udom,$csec)=@_; - return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec); + my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_; + return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec, + $cgroup,$courseopt); } sub parmval_by_symb { - my ($what,$symb,$def,$uname,$udom,$csec)=@_; + my ($what,$symb,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_; # load caches &cacheparmhash(); - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $useropt=&Apache::lonnet::get_userresdata($uname,$udom); - my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom); - my $result=''; my @outpar=(); @@ -130,6 +130,10 @@ sub parmval_by_symb { my $symbparm=$symb.'.'.$what; my $mapparm=$map.'___(all).'.$what; + my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$what; + my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm; + my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm; + my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what; my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm; my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm; @@ -139,49 +143,63 @@ sub parmval_by_symb { my $courselevelm=$env{'request.course.id'}.'.'.$mapparm; - # --------------------------------------------------------- first, check course if (defined($$courseopt{$courselevel})) { - $outpar[11]=$$courseopt{$courselevel}; - $result=11; + $outpar[14]=$$courseopt{$courselevel}; + $result=14; } if (defined($$courseopt{$courselevelm})) { - $outpar[10]=$$courseopt{$courselevelm}; - $result=10; + $outpar[13]=$$courseopt{$courselevelm}; + $result=13; } # ------------------------------------------------------- second, check default - if (defined($def)) { $outpar[9]=$def; $result=9; } + if (defined($def)) { $outpar[12]=$def; $result=12; } # ------------------------------------------------------ third, check map parms my $thisparm=$parmhash{$symbparm}; - if (defined($thisparm)) { $outpar[8]=$thisparm; $result=8; } + if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; } if (defined($$courseopt{$courselevelr})) { - $outpar[7]=$$courseopt{$courselevelr}; - $result=7; + $outpar[10]=$$courseopt{$courselevelr}; + $result=10; } # ------------------------------------------------------ fourth, back to course if (defined($csec)) { if (defined($$courseopt{$seclevel})) { - $outpar[6]=$$courseopt{$seclevel}; - $result=6; + $outpar[9]=$$courseopt{$seclevel}; + $result=9; } if (defined($$courseopt{$seclevelm})) { - $outpar[5]=$$courseopt{$seclevelm}; - $result=5; + $outpar[8]=$$courseopt{$seclevelm}; + $result=8; } if (defined($$courseopt{$seclevelr})) { - $outpar[4]=$$courseopt{$seclevelr}; - $result=4; + $outpar[7]=$$courseopt{$seclevelr}; + $result=7; } } +# ------------------------------------------------------ fifth, check course group + if (defined($cgroup)) { + if (defined($$courseopt{$grplevel})) { + $outpar[6]=$$courseopt{$grplevel}; + $result=6; + } + if (defined($$courseopt{$grplevelm})) { + $outpar[5]=$$courseopt{$grplevelm}; + $result=5; + } + if (defined($$courseopt{$grplevelr})) { + $outpar[4]=$$courseopt{$grplevelr}; + $result=4; + } + } # ---------------------------------------------------------- fifth, check user @@ -275,6 +293,25 @@ sub preset_defaults { } ################################################## + +sub date_sanity_info { + my $checkdate=shift; + unless ($checkdate) { return ''; } + my $result=''; + my $crsprefix='course.'.$env{'request.course.id'}.'.'; + if ($env{$crsprefix.'default_enrollment_end_date'}) { + if ($checkdate>$env{$crsprefix.'default_enrollment_end_date'}) { + $result.='
'.&mt('After course enrollment end!'); + } + } + if ($env{$crsprefix.'default_enrollment_start_date'}) { + if ($checkdate<$env{$crsprefix.'default_enrollment_start_date'}) { + $result.='
'.&mt('Before course enrollment start!'); + } + } + return $result; +} +################################################## ################################################## # # Store a parameter by ID @@ -289,8 +326,8 @@ sub preset_defaults { # - userdomain sub storeparm { - my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec)=@_; - &storeparm_by_symb(&symbcache($sresid),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec); + my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_; + &storeparm_by_symb(&symbcache($sresid),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,'',$cgroup); } # @@ -307,7 +344,7 @@ sub storeparm { my %recstack; sub storeparm_by_symb { - my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag)=@_; + my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_; unless ($recflag) { # first time call %recstack=(); @@ -315,7 +352,9 @@ sub storeparm_by_symb { } # store parameter &storeparm_by_symb_inner - ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec); + ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup); +# don't do anything if parameter was reset + unless ($nval) { return; } my ($prefix,$parm)=($spnam=~/^(.*[\_\.])([^\_\.]+)$/); # remember that this was set $recstack{$parm}=1; @@ -348,7 +387,7 @@ sub storeparm_by_symb { } if ($active) { &storeparm_by_symb($symb,$newspnam,$snum,$newvalue,&rulescache($triggered.'_type'), - $uname,$udom,$csec,$recflag); + $uname,$udom,$csec,$recflag,$cgroup); } } } @@ -357,13 +396,17 @@ sub storeparm_by_symb { sub storeparm_by_symb_inner { # ---------------------------------------------------------- Get symb, map, etc - my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec)=@_; + my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_; # ---------------------------------------------------------- Construct prefixes $spnam=~s/\_([^\_]+)$/\.$1/; my $map=(&Apache::lonnet::decode_symb($symb))[0]; my $symbparm=$symb.'.'.$spnam; my $mapparm=$map.'___(all).'.$spnam; + my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$spnam; + my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm; + my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm; + my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam; my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm; my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm; @@ -373,12 +416,16 @@ sub storeparm_by_symb_inner { my $courselevelm=$env{'request.course.id'}.'.'.$mapparm; my $storeunder=''; - if (($snum==11) || ($snum==3)) { $storeunder=$courselevel; } - if (($snum==10) || ($snum==2)) { $storeunder=$courselevelm; } - if (($snum==7) || ($snum==1)) { $storeunder=$courselevelr; } - if ($snum==6) { $storeunder=$seclevel; } - if ($snum==5) { $storeunder=$seclevelm; } - if ($snum==4) { $storeunder=$seclevelr; } + if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; } + if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; } + if (($snum==10) || ($snum==1)) { $storeunder=$courselevelr; } + if ($snum==9) { $storeunder=$seclevel; } + if ($snum==8) { $storeunder=$seclevelm; } + if ($snum==7) { $storeunder=$seclevelr; } + if ($snum==6) { $storeunder=$grplevel; } + if ($snum==5) { $storeunder=$grplevelm; } + if ($snum==4) { $storeunder=$grplevelr; } + my $delete; if ($nval eq '') { $delete=1;} @@ -392,9 +439,9 @@ sub storeparm_by_symb_inner { my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; # Expire sheets &Apache::lonnet::expirespread('','','studentcalc'); - if (($snum==7) || ($snum==4)) { + if (($snum==10) || ($snum==7) || ($snum==4)) { &Apache::lonnet::expirespread('','','assesscalc',$symb); - } elsif (($snum==8) || ($snum==5)) { + } elsif (($snum==11) || ($snum==8) || ($snum==5)) { &Apache::lonnet::expirespread('','','assesscalc',$map); } else { &Apache::lonnet::expirespread('','','assesscalc'); @@ -488,7 +535,7 @@ sub valout { } $result=~s/\s+$//; } elsif (&isdateparm($type)) { - $result = localtime($value); + $result = localtime($value).&date_sanity_info($value); } else { $result = $value; } @@ -527,17 +574,17 @@ sub plink { my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/); my ($hour,$min,$sec,$val)=&preset_defaults($parmname); unless (defined($winvalue)) { $winvalue=$val; } - return + return '
'. ''. - &valout($value,$type).''; + &valout($value,$type).'
'; } sub startpage { my $r=shift; - + my $loaditems = qq|onUnload="pclose()" onLoad="group_or_section('cgroup')"|; my $bodytag=&Apache::loncommon::bodytag('Set/Modify Course Parameters','', - 'onUnload="pclose()"'); + $loaditems); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Table Mode Parameter Setting'); my $selscript=&Apache::loncommon::studentbrowser_javascript(); my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); @@ -602,19 +649,22 @@ ENDHEAD sub print_row { my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone, - $defbgtwo,$parmlev,$uname,$udom,$csec)=@_; + $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups)=@_; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom); # get the values for the parameter in cascading order # empty levels will remain empty my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which}, - $rid,$$default{$which},$uname,$udom,$csec); + $rid,$$default{$which},$uname,$udom,$csec,$cgroup,$courseopt); # get the type for the parameters # problem: these may not be set for all levels my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'. - $$name{$which}.'.type', - $rid,$$defaulttype{$which},$uname,$udom,$csec); + $$name{$which}.'.type',$rid, + $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt); # cascade down manually my $cascadetype=$$defaulttype{$which}; - for (my $i=11;$i>0;$i--) { + for (my $i=14;$i>0;$i--) { if ($typeoutpar[$i]) { $cascadetype=$typeoutpar[$i]; } else { @@ -638,56 +688,86 @@ sub print_row { my $thismarker=$which; $thismarker=~s/^parameter\_//; my $mprefix=$rid.'&'.$thismarker.'&'; + my $effective_parm = &valout($outpar[$result],$typeoutpar[$result]); + my ($othergrp,$grp_parm,$controlgrp); if ($parmlev eq 'general') { if ($uname) { &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } elsif ($cgroup) { + &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } elsif ($csec) { - &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } else { - &print_td($r,11,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } } elsif ($parmlev eq 'map') { if ($uname) { &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } elsif ($cgroup) { + &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } elsif ($csec) { - &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } else { - &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } } else { + if ($uname) { + if (@{$usersgroups} > 1) { + my ($coursereply,$grp_parm,$controlgrp); + ($coursereply,$othergrp,$grp_parm,$controlgrp) = + &print_usergroups($r,$$part{$which}.'.'.$$name{$which}, + $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt); + if ($coursereply && $result > 3) { + if (defined($controlgrp)) { + if ($cgroup ne $controlgrp) { + $effective_parm = $grp_parm; + $result = 0; + } + } + } + } + } - &print_td($r,11,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,9,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,8,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); if ($csec) { - &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } + + if ($cgroup) { + &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } + if ($uname) { + if ($othergrp) { + $r->print($othergrp); + } &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } } # end of $parmlev if/else - - $r->print(''. - &valout($outpar[$result],$typeoutpar[$result]).''); + $r->print(''.$effective_parm.''); if ($parmlev eq 'full') { my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}. '.'.$$name{$which},$$symbp{$rid}); my $sessionvaltype=$typeoutpar[$result]; if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; } - $r->print(''. + $r->print(''. &valout($sessionval,$sessionvaltype).' '. ''); } @@ -699,7 +779,7 @@ sub print_td { my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_; $r->print(''); - if ($which<8 || $which > 9) { + if ($which<11 || $which > 12) { $r->print(&plink($$typeoutpar[$which], $$display{$value},$$outpar[$which], $mprefix."$which",'parmform.pres','psub')); @@ -709,6 +789,61 @@ sub print_td { $r->print(''."\n"); } +sub print_usergroups { + my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_; + my $courseid = $env{'request.course.id'}; + my $output; + my $symb = &symbcache($rid); + my $symbparm=$symb.'.'.$what; + my $map=(&Apache::lonnet::decode_symb($symb))[0]; + my $mapparm=$map.'___(all).'.$what; + my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype) = + &parm_control_group($courseid,$usersgroups,$symbparm,$mapparm,$what, + $courseopt); + my $bgcolor = $defbg; + my $grp_parm; + if (($coursereply) && ($cgroup ne $resultgroup)) { + if ($result > 3) { + $bgcolor = '"#AAFFAA"'; + $grp_parm = &valout($coursereply,$resulttype); + } + $grp_parm = &valout($coursereply,$resulttype); + $output = ''; + if ($resultgroup && $resultlevel) { + $output .= ''.$resultgroup.' ('.$resultlevel.'): '.$grp_parm; + } else { + $output .= ' '; + } + $output .= ''; + } else { + $output .= ' '; + } + return ($coursereply,$output,$grp_parm,$resultgroup); +} + +sub parm_control_group { + my ($courseid,$usersgroups,$symbparm,$mapparm,$what,$courseopt) = @_; + my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype); + my $grpfound = 0; + my @levels = ($symbparm,$mapparm,$what); + my @levelnames = ('resource','map/folder','general'); + foreach my $group (@{$usersgroups}) { + if ($grpfound) { last; } + for (my $i=0; $i<@levels; $i++) { + my $item = $courseid.'.['.$group.'].'.$levels[$i]; + if (defined($$courseopt{$item})) { + $coursereply = $$courseopt{$item}; + $resultitem = $item; + $resultgroup = $group; + $resultlevel = $levelnames[$i]; + $resulttype = $$courseopt{$item.'.type'}; + $grpfound = 1; + last; + } + } + } + return($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype); +} =pod @@ -956,32 +1091,95 @@ sub partmenu { } sub usermenu { - my ($r,$uname,$id,$udom,$csec)=@_; + my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups)=@_; my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '. &Apache::loncommon::selectstudent_link('parmform','uname','udom'); my $selscript=&Apache::loncommon::studentbrowser_javascript(); my %lt=&Apache::lonlocal::texthash( - 'sg' => "Section/Group", + 'se' => "Section", + 'gr' => "Group", 'fu' => "For User", 'oi' => "or ID", 'ad' => "at Domain" ); my %sectionhash=(); my $sections=''; - if (&Apache::loncommon::get_sections( + my $numsec = &Apache::loncommon::get_sections( $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}, - \%sectionhash)) { - $sections=$lt{'sg'}.': '.$section. + ''; } $sections.=''; - } - $r->print(< +function group_or_section(caller) { + if (caller == "cgroup") { + if (document.parmform.cgroup.selectedIndex != 0) { + document.parmform.csec.selectedIndex = 0; + } + } else { + if (document.parmform.csec.selectedIndex != 0) { + document.parmform.cgroup.selectedIndex = 0; + } + } +} + +|; + } else { + $sections .= qq| + +|; + } + if ($numgrp > 0) { + $groups=$lt{'gr'}.': '; + } + $r->print(< $sections +$groups
$lt{'fu'} @@ -1035,11 +1233,12 @@ sub levelmenu { sub sectionmenu { my ($r,$selectedsections)=@_; my %sectionhash=(); - - if (&Apache::loncommon::get_sections( + my $sections=''; + my $numsec = &Apache::loncommon::get_sections( $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}, - \%sectionhash)) { + \%sectionhash); + if ($numsec) { $r->print('\n"); + $r->print("\n"); + } +} + +sub groupmenu { + my ($r,$selectedgroups)=@_; + my %grouphash; + my $numgrp = &Apache::loncommon::coursegroups( + \%grouphash, + $env{'course.'.$env{'request.course.id'}.'.domain'}, + $env{'course.'.$env{'request.course.id'}.'.num'}); + if ($numgrp) { + $r->print('\n"); } } + sub keysplit { my $keyp=shift; return (split(/\,/,$keyp)); @@ -1175,6 +1398,9 @@ sub assessparms { my $udom; my $uhome; my $csec; + my $cgroup; + my $grouplist; + my @usersgroups = (); my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'}; @@ -1196,6 +1422,7 @@ sub assessparms { my $message=''; $csec=$env{'form.csec'}; + $cgroup=$env{'form.cgroup'}; if ($udom=$env{'form.udom'}) { } elsif ($udom=$env{'request.role.domain'}) { @@ -1262,12 +1489,14 @@ sub assessparms { } else { $csec=&Apache::lonnet::getsection($udom,$uname, $env{'request.course.id'}); + if ($csec eq '-1') { $message="". &mt("User")." '$uname' ".&mt("at domain")." '$udom' ". &mt("not in this course").""; $uname=''; $csec=$env{'form.csec'}; + $cgroup=$env{'form.cgroup'}; } else { my %name=&Apache::lonnet::userenvironment($udom,$uname, ('firstname','middlename','lastname','generation','id')); @@ -1276,10 +1505,22 @@ sub assessparms { .$name{'lastname'}.' '.$name{'generation'}. "
\n".&mt('ID').": ".$name{'id'}.'

'; } + $grouplist = &Apache::lonnet::get_users_groups( + $udom,$uname,$env{'request.course.id'}); + if ($grouplist) { + @usersgroups = &Apache::lonnet::sort_course_groups($grouplist, + $env{'request.course.id'}); + unless (grep/^\Q$cgroup\E$/,@usersgroups) { + $cgroup = $usersgroups[0]; + } + } else { + $cgroup = ''; + } } } unless ($csec) { $csec=''; } + unless ($cgroup) { $cgroup=''; } # --------------------------------------------------------- Get all assessments &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, @@ -1298,7 +1539,7 @@ sub assessparms { $message.=&storeparm(split(/\&/,$markers[$i]), $values[$i], $types[$i], - $uname,$udom,$csec); + $uname,$udom,$csec,$cgroup); } # ---------------------------------------------------------------- Done storing $message.='

'.&mt('Changes can take up to 10 minutes before being active for all students.').&Apache::loncommon::help_open_topic('Caching').'

'; @@ -1334,7 +1575,7 @@ sub assessparms { '

'); } - &usermenu($r,$uname,$id,$udom,$csec); + &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups); $r->print('

'.$message.'

'); @@ -1356,11 +1597,19 @@ sub assessparms { if ($parmlev eq 'full') { my $coursespan=$csec?8:5; + my $userspan=3; + if ($cgroup ne '') { + $coursespan += 3; + } + $r->print('

'); $r->print(''); $r->print(''); if ($uname) { - $r->print(""); } my %lt=&Apache::lonlocal::texthash( @@ -1389,7 +1638,11 @@ sub assessparms { ENDTABLETWO if ($csec) { $r->print(""); + &mt("in Section")." $csec"); + } + if ($cgroup) { + $r->print(""); } $r->print(< @@ -1402,7 +1655,14 @@ ENDTABLEHEADFOUR $r->print(''); } + if ($cgroup) { + $r->print(''); + } + if ($uname) { + if (@usersgroups > 1) { + $r->print(''); + } $r->print(''); } @@ -1410,6 +1670,7 @@ ENDTABLEHEADFOUR my $defbgone=''; my $defbgtwo=''; + my $defbgthree = ''; foreach (@ids) { @@ -1431,6 +1692,12 @@ ENDTABLEHEADFOUR } else { $defbgtwo='"#FFFF99"'; } + if ($defbgthree eq '"#FFBB99"') { + $defbgthree='"#FFBBDD"'; + } else { + $defbgthree='"#FFBB99"'; + } + my $thistitle=''; my %name= (); undef %name; @@ -1456,14 +1723,15 @@ ENDTABLEHEADFOUR my $totalparms=scalar keys %name; if ($totalparms>0) { my $firstrow=1; - my $title=&Apache::lonnet::gettitle($uri); + my $title=&Apache::lonnet::gettitle($symbp{$rid}); $r->print(''); &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default, - \%type,\%display,$defbgone,$defbgtwo, - $parmlev,$uname,$udom,$csec); + \%type,\%display,$defbgone,$defbgtwo,$defbgthree, + $parmlev,$uname,$udom,$csec,$cgroup); } $r->print("
'.&mt('Any User').'"); + if (@usersgroups > 1) { + $userspan ++; + } + $r->print(''); $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom". - &mt("in Section/Group")." $csec". + &mt("in Group")." $cgroup
$lt{'aut'}$lt{'type'}'.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').''.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').''.&mt('Control by other group?').''.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').'
'. join(' / ',split(/\//,$uri)). '

'. "$title"); @@ -1485,10 +1753,10 @@ ENDTABLEHEADFOUR } else { undef $firstrow; } - &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default, \%type,\%display,$defbgone,$defbgtwo, - $parmlev,$uname,$udom,$csec); + $defbgthree,$parmlev,$uname,$udom,$csec, + $cgroup,\@usersgroups); } } } @@ -1500,6 +1768,7 @@ ENDTABLEHEADFOUR if ($parmlev eq 'map') { my $defbgone = '"E0E099"'; my $defbgtwo = '"FFFF99"'; + my $defbgthree = '"FFBB99"'; my %maplist; @@ -1571,19 +1840,20 @@ Set Defaults for All Resources in $folde Specifically for ENDMAPONE if ($uname) { - my %name=&Apache::lonnet::userenvironment($udom,$uname, - ('firstname','middlename','lastname','generation', 'id')); - my $person=$name{'firstname'}.' '.$name{'middlename'}.' ' - .$name{'lastname'}.' '.$name{'generation'}; + my $person=&Apache::loncommon::plainname($uname,$udom); $r->print(&mt("User")." $uname \($person\) ". &mt('in')." \n"); } else { $r->print("".&mt('all').' '.&mt('users in')." \n"); } - - if ($csec) {$r->print(&mt("Section")." $csec ". - &mt('of')." \n")}; - + if ($cgroup) { + $r->print(&mt("Group")." $cgroup". + " ".&mt('of')." \n"); + $csec = ''; + } elsif ($csec) { + $r->print(&mt("Section")." $csec". + " ".&mt('of')." \n"); + } $r->print("$coursename
"); $r->print("\n"); #---------------------------------------------------------------- print table @@ -1595,8 +1865,8 @@ ENDMAPONE foreach (&keysinorder(\%name,\%keyorder)) { $r->print('

"); } # end each map @@ -1605,6 +1875,7 @@ ENDMAPONE if ($parmlev eq 'general') { my $defbgone = '"E0E099"'; my $defbgtwo = '"FFFF99"'; + my $defbgthree = '"FFBB99"'; #-------------------------------------------- for each map, gather information my $mapid="0.0"; @@ -1652,16 +1923,14 @@ ENDMAPONE $coursename
ENDMAPONE if ($uname) { - my %name=&Apache::lonnet::userenvironment($udom,$uname, - ('firstname','middlename','lastname','generation', 'id')); - my $person=$name{'firstname'}.' '.$name{'middlename'}.' ' - .$name{'lastname'}.' '.$name{'generation'}; + my $person=&Apache::loncommon::plainname($uname,$udom); $r->print(" ".&mt("User")." $uname \($person\) \n"); } else { $r->print(" ".&mt("ALL")." ".&mt("USERS")." \n"); } if ($csec) {$r->print(&mt("Section")." $csec\n")}; + if ($cgroup) {$r->print(&mt("Group")." $csec\n")}; $r->print("\n"); #---------------------------------------------------------------- print table $r->print('

'); @@ -1672,7 +1941,8 @@ ENDMAPONE foreach (&keysinorder(\%name,\%keyorder)) { $r->print(''); &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default, - \%type,\%display,$defbgone,$defbgtwo,$parmlev,$uname,$udom,$csec); + \%type,\%display,$defbgone,$defbgtwo,$defbgthree, + $parmlev,$uname,$udom,$csec,$cgroup); } $r->print("
"); } # end of $parmlev eq general @@ -1887,8 +2157,11 @@ sub crsenv { => ''.&mt('Allow limited HTML in discussion posts').'
'. '('.&mt('Set value to "[_1]" to allow',"yes").')', 'allow_discussion_post_editing' - => ''.&mt('Allow users to edit/delete their own discussion posts').'
'. - '('.&mt('Set value to "[_1]" to allow',"yes").')', + => ''.&mt('Allow users with specified roles to edit/delete their own discussion posts').'
"st": '. + &mt('student').', "ta": '. + 'TA, "in": '. + &mt('instructor').'; ('.&mt('role:section,role:section,..., e.g., st:001,st:002,in,cc would permit students in sections 001 and 002 and instructors in any section, and course coordinators to edit their own posts.').')
'. + '('.&mt('or set value to "[_1]" to allow all roles',"yes").')', 'rndseed' => ''.&mt('Randomization algorithm used').'
'. ''.&mt('Modifying this will make problems').' '. @@ -1897,8 +2170,8 @@ sub crsenv { => ''.&mt('Receipt algorithm used').'
'. &mt('This controls how receipt numbers are generated.'), 'suppress_tries' - => ''.&mt('Suppress number of tries in printing').'('. - &mt('yes if supress').')', + => ''.&mt('Suppress number of tries in printing').'
'. + ' ('.&mt('"[_1]" to suppress, anything else to not suppress','yes').')', 'problem_stream_switch' => ''.&mt('Allow problems to be split over pages').'
'. ' ('.&mt('"[_1]" if allowed, anything else if not','yes').')', @@ -2306,7 +2579,8 @@ sub listdata { $jskey, $$resourcedata{$thiskey}, '',1,'','',$hour,$min,$sec). -'' +''. +&date_sanity_info($$resourcedata{$thiskey}) ); } elsif ($thistype eq 'string_yesno') { my $showval; @@ -2380,6 +2654,7 @@ ENDOVER $alllevs{'Course Level'}='general'; my $csec=$env{'form.csec'}; + my $cgroup=$env{'form.cgroup'}; my @pscat=&Apache::loncommon::get_env_multiple('form.pscat'); my $pschp=$env{'form.pschp'}; @@ -2394,6 +2669,8 @@ ENDOVER @selected_sections = ('all'); } } + my @selected_groups = + &Apache::loncommon::get_env_multiple('form.Group'); my $pssymb=''; my $parmlev=''; @@ -2421,11 +2698,15 @@ ENDOVER $r->print('
'); &parmmenu($r,\%allparms,\@pscat,\%keyorder); - $r->print(''); + $r->print(''. + '
'.&mt('Parts').''.&mt('Section(s)'). + ''.&mt('Group(s)').'
'); &partmenu($r,\%allparts,\@psprt); - $r->print(''); + $r->print(' '); §ionmenu($r,\@selected_sections); - + $r->print(' '); + &groupmenu($r,\@selected_groups); + $r->print('
'); $r->print('
'); my $sortorder=$env{'form.sortorder'}; @@ -2440,37 +2721,8 @@ ENDOVER %{$listdata}=(); foreach my $cat (@pscat) { - foreach my $section (@selected_sections) { - foreach my $part (@psprt) { - my $rootparmkey=$env{'request.course.id'}; - if (($section ne 'all') && ($section ne 'none') && ($section)) { - $rootparmkey.='.['.$section.']'; - } - if ($parmlev eq 'general') { -# course-level parameter - my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat; - $$listdata{$newparmkey}=1; - $$listdata{$newparmkey.'.type'}=$defkeytype{$cat}; - } elsif ($parmlev eq 'map') { -# map-level parameter - foreach my $mapid (keys %allmaps) { - if (($pschp ne 'all') && ($pschp ne $mapid)) { next; } - my $newparmkey=$rootparmkey.'.'.$allmaps{$mapid}.'___(all).'.$part.'.'.$cat; - $$listdata{$newparmkey}=1; - $$listdata{$newparmkey.'.type'}=$defkeytype{$cat}; - } - } else { -# resource-level parameter - foreach my $rid (@ids) { - my ($map,$resid,$url)=&Apache::lonnet::decode_symb($symbp{$rid}); - if (($pschp ne 'all') && ($allmaps{$pschp} ne $map)) { next; } - my $newparmkey=$rootparmkey.'.'.$symbp{$rid}.'.'.$part.'.'.$cat; - $$listdata{$newparmkey}=1; - $$listdata{$newparmkey.'.type'}=$defkeytype{$cat}; - } - } - } - } + &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_sections,\%defkeytype,\%allmaps,\@ids,\%symbp); + &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_groups,\%defkeytype,\%allmaps,\@ids,\%symbp); } if (($env{'form.store'}) || ($env{'form.dis'})) { @@ -2490,6 +2742,41 @@ ENDOVER ''); } +sub secgroup_lister { + my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_; + foreach my $item (@{$selections}) { + foreach my $part (@{$psprt}) { + my $rootparmkey=$env{'request.course.id'}; + if (($item ne 'all') && ($item ne 'none') && ($item)) { + $rootparmkey.='.['.$item.']'; + } + if ($parmlev eq 'general') { +# course-level parameter + my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat; + $$listdata{$newparmkey}=1; + $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat}; + } elsif ($parmlev eq 'map') { +# map-level parameter + foreach my $mapid (keys %{$allmaps}) { + if (($pschp ne 'all') && ($pschp ne $mapid)) { next; } + my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat; + $$listdata{$newparmkey}=1; + $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat}; + } + } else { +# resource-level parameter + foreach my $rid (@{$ids}) { + my ($map,$resid,$url)=&Apache::lonnet::decode_symb($$symbp{$rid}); + if (($pschp ne 'all') && ($$allmaps{$pschp} ne $map)) { next; } + my $newparmkey=$rootparmkey.'.'.$$symbp{$rid}.'.'.$part.'.'.$cat; + $$listdata{$newparmkey}=1; + $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat}; + } + } + } + } +} + sub overview { my $r=shift; my $bodytag=&Apache::loncommon::bodytag('Modify Parameters'); @@ -2696,16 +2983,24 @@ ENDMAINFORMHEAD # my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $vgr = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}); + my @menu = ( { text => 'Set Course Environment Parameters', action => 'crsenv', permission => $parm_permission, }, - { text => 'Set Instructor Defined Metadata', - action => 'setinstmeta', + { text => 'Set Portfolio Metadata', + action => 'setrestrictmeta', permission => $parm_permission, }, + { text => 'Manage Course Slots', + url => '/adm/slotrequest?command=showslots', + permission => $vgr, + }, + { divider => 1, + }, { text => 'Set/Modify Resource Parameters - Helper Mode', url => '/adm/helper/parameter.helper', permission => $parm_permission, @@ -2730,6 +3025,10 @@ ENDMAINFORMHEAD ); my $menu_html = ''; foreach my $menu_item (@menu) { + if ($menu_item->{'divider'}) { + $menu_html .= '


'; + next; + } next if (! $menu_item->{'permission'}); $menu_html.='

'; $menu_html.=''; @@ -2749,38 +3048,32 @@ ENDMAINFORMHEAD $r->print($menu_html); return; } -### Set instructor defined metadata +### Set portfolio metadata sub output_row { - my ($field_name) = @_; + my ($r, $field_name, $field_text) = @_; my $output; - my $meta_hash_ref=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name}; - my $values=$$meta_hash_ref{'values'}; - my $checked; - unless (defined($$meta_hash_ref{'active'})) { - $$meta_hash_ref{'active'} = 'no'; - $$meta_hash_ref{'stu_add_values'} = 'yes'; - $$meta_hash_ref{'values'} = 'Type a list of values separated by commas.'; - $$meta_hash_ref{'stu_pick_many'} = 'yes'; - } - $output.=''.$field_name.''; - $output.=''; - if ($$meta_hash_ref{'stu_add_values'}eq'yes') { - $checked = ' CHECKED '; - } else { - $checked = ' '; + my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'}; + my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'}; + unless (defined($options)) { + $options = 'active,stuadd'; + $values = ''; + } + $output.=''.$field_text.':'; + $output.='
'; + + my @options= ( ['active', 'Show to student'], + ['onlyone','Student may select only one choice'], + ['stuadd', 'Student may type choices']); + foreach my $opt (@options) { + my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ; + $output.=(' 'x5).'
'; } - $output.='

'; - if ($$meta_hash_ref{'stu_pick_many'}eq'yes') { - $checked = ' CHECKED '; - } else { - $checked = ' '; - } - $output.=''; - $output.=''; - return ($output); } -sub setinstmeta { + +sub setrestrictmeta { my ($r)=@_; my $next_meta; my $output; @@ -2788,104 +3081,56 @@ sub setinstmeta { my $put_result; $r->print(&Apache::lonxml::xmlbegin()); $r->print(' - LON-CAPA Set Instructor Metadata + LON-CAPA Restrict Metadata '); - $r->print(&Apache::loncommon::bodytag('Set Instructor Metadata')); + $r->print(&Apache::loncommon::bodytag('Restrict Metadata')); $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef, - 'Set Instructor Metadata')); + 'Restrict Metadata')); my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $key_base = $env{'course.'.$env{'request.course.id'}.'.metadata.'}; + my $key_base = $env{'course.'.$env{'request.course.id'}.'.'}; my $save_field = ''; - my %meta_hash; - if ($env{'form.instmeta'}) { - foreach my $field (sort %env) { + if ($env{'form.restrictmeta'}) { + foreach my $field (sort(keys(%env))) { if ($field=~m/^form.(.+)_(.+)$/) { + my $options; my $meta_field = $1; my $meta_key = $2; - if ($save_field eq $meta_field) { - %meta_hash = {$meta_key=>[$env{$field}]}; - } else { - if ($save_field ne '') { - %meta_hash = {active=>'yes'}; - my $value = \%meta_hash; - my $name = $save_field; - $r->print('Saving '.$name.' meta
'); - $put_result = &Apache::lonnet::put('environment', - {$name=>$value},$dom,$crs); - } + if ($save_field ne $meta_field) { $save_field = $meta_field; - %meta_hash = {$meta_key=>[$env{$field}]}; + if ($env{'form.'.$meta_field.'_stuadd'}) { + $options.='stuadd,'; + } + if ($env{'form.'.$meta_field.'_onlyone'}) { + $options.='onlyone,'; + } + if ($env{'form.'.$meta_field.'_active'}) { + $options.='active,'; + } + my $name = $save_field; + $put_result = &Apache::lonnet::put('environment', + {'metadata.'.$meta_field.'.options'=>$options, + 'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'}, + },$dom,$crs); } } - - } - %meta_hash = {active=>'yes'}; - my $value = \%meta_hash; - my $name = $save_field; - $r->print('Saving '.$name.' meta
'); - $put_result = &Apache::lonnet::put('environment', - {$name=>$value},$dom,$crs); - } - foreach my $field (%env) { - # start by looking for populated fields - if ($field=~m/type(\d+)/) { - my $name; - my $value; - $put_result = &Apache::lonnet::put('environment', - {$name=>$value},$dom,$crs); - $put_result = &Apache::lonnet::put('environment', - {$name=>$value},$dom,$crs); - } - if ($field=~m/newfield/) { - my $name = 'metadata.'.$env{'form.titlenew'}; - my %meta_hash = {values=>[$env{'form.valuesnew'}], - allow_pick=>'many', - allow_type=>'no'}; - - my $value = \%meta_hash; - $put_result = &Apache::lonnet::put('environment', - {$name=>$value},$dom,$crs); - } - } + } &Apache::lonnet::coursedescription($env{'request.course.id'}); - $output.= &output_row("Title"); - $output.= &output_row("Subject"); - $output.= &output_row("Keywords"); -# foreach my $key (sort keys %env) { -# if ($key=~m/^course\.$env{'request.course.id'}\.metadata\.(.+)$/) { -# my $meta_data_item = $1; -# my $meta_hash=$env{$key}; -# # keys are 'values', stu_pick_many, stu_add_values, active -# -# $output.=''.$meta_data_item.''; -# $output.='Select one:
'; -# $output.='Select many: '; -# $output.=''; -# } -# } -# $output.='Create new instructor metadata item
'; -# $output.=''; -# $output.='students must pick only one:
'; -# $output.='Allow student to type extra info: '; -# $output.=''; -# $output.=''; -# $output.=''; + my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio'); + foreach my $field (sort(keys(%metadata_fields))) { + &Apache::lonnet::logthis ($field); + if ($field ne 'courserestricted') { + $output.= &output_row($r, $field, $metadata_fields{$field}); + } + } $r->print(< - +

- - $output -
Metadata ItemValuesOnly One ChoiceStudent Can Add Choices
- +

- ENDenv - - $r->print(' '); return 'ok'; @@ -3062,6 +3307,7 @@ Main handler. Calls &assessparms and &c ################################################## # use Data::Dumper; + sub handler { my $r=shift; @@ -3122,10 +3368,10 @@ sub handler { &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview', text=>"Overview Mode"}); &overview($r); - } elsif ($env{'form.action'} eq 'setinstmeta' && $parm_permission) { - &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setinstmeta', - text=>"Instructor Metadata"}); - &setinstmeta($r); + } elsif ($env{'form.action'} eq 'setrestrictmeta' && $parm_permission) { + &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta', + text=>"Restrict Metadata"}); + &setrestrictmeta($r); } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) { &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview', text=>"Overview Mode"});