--- loncom/interface/lonparmset.pm 2005/06/06 21:28:55 1.216
+++ loncom/interface/lonparmset.pm 2006/03/07 21:36:19 1.279
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
-# $Id: lonparmset.pm,v 1.216 2005/06/06 21:28:55 www Exp $
+# $Id: lonparmset.pm,v 1.279 2006/03/07 21:36:19 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -70,6 +70,8 @@ my $parmhashid;
my %parmhash;
my $symbsid;
my %symbs;
+my $rulesid;
+my %rules;
# --- end local caches
@@ -86,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
@@ -104,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=();
@@ -128,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;
@@ -137,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
@@ -240,6 +260,57 @@ sub symbcache {
return $symbs{$id};
}
+sub resetrulescache {
+ $rulesid='';
+}
+
+sub rulescache {
+ my $id=shift;
+ if ($rulesid ne $env{'request.course.id'}) {
+ %rules=();
+ }
+ unless (defined($rules{$id})) {
+ my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ %rules=&Apache::lonnet::dump('parmdefactions',$dom,$crs);
+ $rulesid=$env{'request.course.id'};
+ }
+ return $rules{$id};
+}
+
+sub preset_defaults {
+ my $type=shift;
+ if (&rulescache($type.'_action') eq 'default') {
+# yes, there is something
+ return (&rulescache($type.'_hours'),
+ &rulescache($type.'_min'),
+ &rulescache($type.'_sec'),
+ &rulescache($type.'_value'));
+ } else {
+# nothing there or something else
+ return ('','','','','');
+ }
+}
+
+##################################################
+
+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;
+}
##################################################
##################################################
#
@@ -255,8 +326,8 @@ sub symbcache {
# - 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);
}
#
@@ -271,15 +342,71 @@ sub storeparm {
# - username
# - userdomain
+my %recstack;
sub storeparm_by_symb {
+ my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_;
+ unless ($recflag) {
+# first time call
+ %recstack=();
+ $recflag=1;
+ }
+# store parameter
+ &storeparm_by_symb_inner
+ ($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;
+# what does this trigger?
+ foreach my $triggered (split(/\:/,&rulescache($parm.'_triggers'))) {
+# don't backfire
+ unless ((!$triggered) || ($recstack{$triggered})) {
+ my $action=&rulescache($triggered.'_action');
+ my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
+# set triggered parameter on same level
+ my $newspnam=$prefix.$triggered;
+ my $newvalue='';
+ my $active=1;
+ if ($action=~/^when\_setting/) {
+# are there restrictions?
+ if (&rulescache($triggered.'_triggervalue')=~/\w/) {
+ $active=0;
+ foreach my $possiblevalue (split(/\s*\,\s*/,&rulescache($triggered.'_triggervalue'))) {
+ if (lc($possiblevalue) eq lc($nval)) { $active=1; }
+ }
+ }
+ $newvalue=&rulescache($triggered.'_value');
+ } else {
+ my $totalsecs=((&rulescache($triggered.'_days')*24+&rulescache($triggered.'_hours'))*60+&rulescache($triggered.'_min'))*60+&rulescache($triggered.'_sec');
+ if ($action=~/^later\_than/) {
+ $newvalue=$nval+$totalsecs;
+ } else {
+ $newvalue=$nval-$totalsecs;
+ }
+ }
+ if ($active) {
+ &storeparm_by_symb($symb,$newspnam,$snum,$newvalue,&rulescache($triggered.'_type'),
+ $uname,$udom,$csec,$recflag,$cgroup);
+ }
+ }
+ }
+ return '';
+}
+
+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;
@@ -289,12 +416,16 @@ sub storeparm_by_symb {
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;}
@@ -308,9 +439,9 @@ sub storeparm_by_symb {
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');
@@ -404,7 +535,7 @@ sub valout {
}
$result=~s/\s+$//;
} elsif (&isdateparm($type)) {
- $result = localtime($value);
+ $result = localtime($value).&date_sanity_info($value);
} else {
$result = $value;
}
@@ -440,19 +571,20 @@ sub plink {
$winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
}
}
-
-
- return
+ my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);
+ my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
+ unless (defined($winvalue)) { $winvalue=$val; }
+ return '
'.
''.
- &valout($value,$type).' ';
+ .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.
+ &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();
@@ -517,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 {
@@ -544,62 +679,95 @@ sub print_row {
} else {
$parm=~s|\[.*\]\s||g;
}
-
+ my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');
+ if ($automatic) {
+ $parm.=' '.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).' ';
+ }
$r->print(''.$parm.' ');
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).' '.
' ');
}
@@ -611,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'));
@@ -621,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
@@ -776,8 +999,18 @@ sub parmmenu {
checkthis('duedate','pscat');
checkthis('opendate','pscat');
checkthis('answerdate','pscat');
- checkthis('interval','pscat');
- }
+ }
+
+ function checkdisset() {
+ checkthis('discussend','pscat');
+ checkthis('discusshide','pscat');
+ }
+
+ function checkcontdates() {
+ checkthis('contentopen','pscat');
+ checkthis('contentclose','pscat');
+ }
+
function checkvisi() {
checkthis('hiddenresource','pscat');
@@ -806,12 +1039,12 @@ ENDSCRIPT
$r->print("\n');
@@ -841,7 +1076,9 @@ sub partmenu {
$r->print('>'.&mt('All Parts').'');
my %temphash=();
foreach (@{$psprt}) { $temphash{$_}=1; }
- foreach my $tempkey (sort keys %{$allparts}) {
+ foreach my $tempkey (sort {
+ if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); }
+ } keys(%{$allparts})) {
unless ($tempkey =~ /\./) {
$r->print(' "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'}.': ';
- foreach ('',sort keys %sectionhash) {
- $sections.=''.$_.' ';
+ \%sectionhash);
+ my $groups;
+ my %grouphash;
+ my $numgrp = &Apache::loncommon::coursegroups(
+ \%grouphash,
+ $env{'course.'.$env{'request.course.id'}.'.domain'},
+ $env{'course.'.$env{'request.course.id'}.'.num'});
+ if ($numsec > 0) {
+ $sections=$lt{'se'}.': '.$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'}.': ';
+ }
+ $groups.=' ';
+ }
+ $r->print(<
$sections
+$groups
$lt{'fu'}
@@ -903,7 +1203,7 @@ sub displaymenu {
sub mapmenu {
my ($r,$allmaps,$pschp,$maptitles)=@_;
- $r->print(&mt('Select Enclosing Map or Folder').' ');
+ $r->print(''.&mt('Select Enclosing Map or Folder').' ');
$r->print('');
$r->print(''.&mt('All Maps or Folders').' ');
foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
@@ -916,8 +1216,8 @@ sub mapmenu {
sub levelmenu {
my ($r,$alllevs,$parmlev)=@_;
- $r->print(&mt('Select Parameter Level').
- &Apache::loncommon::help_open_topic('Course_Parameter_Levels').' ');
+ $r->print(''.&mt('Select Parameter Level').
+ &Apache::loncommon::help_open_topic('Course_Parameter_Levels').' ');
$r->print('');
foreach (reverse sort keys %{$alllevs}) {
$r->print('print('');
foreach my $s ('all',sort keys %sectionhash) {
$r->print(' print('>'.$s." \n");
}
- $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('');
+ foreach my $group (sort(keys(%grouphash))) {
+ $r->print(' print(' selected');
+ last;
+ }
+ }
+ $r->print('>'.$group." \n");
+ }
+ $r->print(" \n");
}
}
+
sub keysplit {
my $keyp=shift;
return (split(/\,/,$keyp));
@@ -965,6 +1290,18 @@ sub keysinorder {
} (keys %{$name});
}
+sub keysinorder_bytype {
+ my ($name,$keyorder)=@_;
+ return sort {
+ my $ta=(split('_',$a))[-1];
+ my $tb=(split('_',$b))[-1];
+ if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
+ return ($a cmp $b);
+ }
+ $$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
+ } (keys %{$name});
+}
+
sub keysindisplayorder {
my ($name,$keyorder)=@_;
return sort {
@@ -974,16 +1311,17 @@ sub keysindisplayorder {
sub sortmenu {
my ($r,$sortorder)=@_;
- $r->print(' print(' print(' checked="on"');
}
$r->print(' />'.&mt('Sort by realm first, then student (group/section)'));
- $r->print(' print(' print(' checked="on"');
}
- $r->print(' />'.&mt('Sort by student (group/section) first, then realm'));
+ $r->print(' />'.&mt('Sort by student (group/section) first, then realm').
+ ' ');
}
sub standardkeyorder {
@@ -1004,7 +1342,9 @@ sub standardkeyorder {
'parameter_0_ordered' => 15,
'parameter_0_tol' => 16,
'parameter_0_sig' => 17,
- 'parameter_0_turnoffunit' => 18);
+ 'parameter_0_turnoffunit' => 18,
+ 'parameter_0_discussend' => 19,
+ 'parameter_0_discusshide' => 20);
}
##################################################
@@ -1058,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'};
@@ -1079,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'}) {
@@ -1145,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'));
@@ -1159,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,
@@ -1181,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').' ';
@@ -1213,9 +1571,11 @@ sub assessparms {
} else {
my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
$r->print(&mt('Specific Resource').": ".$resource.
- ' ');
+ ' '.
+ ''.&mt('Show all parts').': ');
}
- &usermenu($r,$uname,$id,$udom,$csec);
+ &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
$r->print(''.$message.'
');
@@ -1237,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(''.&mt('Any User').' ');
if ($uname) {
- $r->print("");
+ if (@usersgroups > 1) {
+ $userspan ++;
+ }
+ $r->print(' ');
$r->print(&mt("User")." $uname ".&mt('at Domain')." $udom ");
}
my %lt=&Apache::lonlocal::texthash(
@@ -1270,7 +1638,11 @@ sub assessparms {
ENDTABLETWO
if ($csec) {
$r->print("".
- &mt("in Section/Group")." $csec ");
+ &mt("in Section")." $csec");
+ }
+ if ($cgroup) {
+ $r->print("".
+ &mt("in Group")." $cgroup ");
}
$r->print(<$lt{'aut'} $lt{'type'}
@@ -1283,7 +1655,14 @@ ENDTABLEHEADFOUR
$r->print(''.&mt('general').' '.&mt('for Enclosing Map or Folder').' '.&mt('for Resource').' ');
}
+ if ($cgroup) {
+ $r->print(''.&mt('general').' '.&mt('for Enclosing Map or Folder').' '.&mt('for Resource').' ');
+ }
+
if ($uname) {
+ if (@usersgroups > 1) {
+ $r->print(''.&mt('Control by other group?').' ');
+ }
$r->print(''.&mt('general').' '.&mt('for Enclosing Map or Folder').' '.&mt('for Resource').' ');
}
@@ -1291,6 +1670,7 @@ ENDTABLEHEADFOUR
my $defbgone='';
my $defbgtwo='';
+ my $defbgthree = '';
foreach (@ids) {
@@ -1312,6 +1692,12 @@ ENDTABLEHEADFOUR
} else {
$defbgtwo='"#FFFF99"';
}
+ if ($defbgthree eq '"#FFBB99"') {
+ $defbgthree='"#FFBBDD"';
+ } else {
+ $defbgthree='"#FFBB99"';
+ }
+
my $thistitle='';
my %name= ();
undef %name;
@@ -1337,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(''.
join(' / ',split(/\//,$uri)).
' '.
"$title");
@@ -1358,23 +1745,18 @@ ENDTABLEHEADFOUR
$r->print('
');
-
- $r->print(' / res / ');
- $r->print(join(' / ', split(/\//,$mapp{$rid})));
-
- $r->print(' ');
+ '>'.$maptitles{$mapp{$rid}}.'');
- foreach (&keysinorder(\%name,\%keyorder)) {
+ foreach (&keysinorder_bytype(\%name,\%keyorder)) {
unless ($firstrow) {
$r->print('');
} 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);
}
}
}
@@ -1386,6 +1768,7 @@ ENDTABLEHEADFOUR
if ($parmlev eq 'map') {
my $defbgone = '"E0E099"';
my $defbgtwo = '"FFFF99"';
+ my $defbgthree = '"FFBB99"';
my %maplist;
@@ -1457,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
@@ -1481,8 +1865,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 each map
@@ -1491,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";
@@ -1538,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('
');
@@ -1558,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
@@ -1655,9 +2039,13 @@ sub crsenv {
#
# Let the user know we made the changes
if ($name && defined($value)) {
+ my $failed_cloners;
if ($name eq 'cloners') {
+ $value =~ s/\s//g;
$value =~ s/^,//;
$value =~ s/,$//;
+ # check requested clones are valid users.
+ $failed_cloners = &check_cloners(\$value,\@oldcloner);
}
my $put_result = &Apache::lonnet::put('environment',
{$name=>$value},$dom,$crs);
@@ -1674,6 +2062,18 @@ sub crsenv {
$setoutput.=&mt('Unable to set').' '.$name.' '.&mt('to').
' '.$value.' '.&mt('due to').' '.$put_result.'. ';
}
+ if (($name eq 'cloners') && ($failed_cloners)) {
+ $setoutput.= &mt('Unable to include').' - '.$failed_cloners.' , '.
+ &mt('reason').' - '.&mt('LON-CAPA user(s) do(es) not exist').
+ '. '.&mt('Please ').
+ ' '.
+ &mt('add the user(s)').' , '.
+ &mt('and then return to the ').
+ ''.
+ &mt('Course Parameters page').' '.
+ &mt('to add the new user(s) to the list of possible cloners').
+ '. ';
+ }
}
}
# ------------------------- Re-init course environment entries for this session
@@ -1757,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').' '.
@@ -1767,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 ').')',
@@ -1780,8 +2183,8 @@ sub crsenv {
'anonymous_quiz'
=> ''.&mt('Anonymous quiz/exam').' '.
' ('.&mt('yes').' '.&mt('to avoid print students names').' )',
- 'default_enrollment_start_date' => ''.&mt('Default beginning date when enrolling students').' ',
- 'default_enrollment_end_date' => ''.&mt('Default ending date when enrolling students').' ',
+ 'default_enrollment_start_date' => ''.&mt('Default beginning date for student access.').' ',
+ 'default_enrollment_end_date' => ''.&mt('Default ending date for student access.').' ',
'nothideprivileged' => ''.&mt('Privileged users that should not be hidden on staff listings').' '.
' (user:domain,user:domain,... )',
'languages' => ''.&mt('Languages used').' ',
@@ -1791,10 +2194,16 @@ sub crsenv {
'disablesigfigs'
=> ''.&mt('Disable checking of Significant Figures').' '.
' ('.&mt('"[_1]" to disable, anything else if not','yes ').')',
+ 'disableexampointprint'
+ => ''.&mt('Disable automatically printing point values onto exams.').' '.
+ ' ('.&mt('"[_1]" to disable, anything else if not','yes ').')',
+ 'externalsyllabus'
+ => ''.&mt('URL of Syllabus (not using internal handler)').' ',
'tthoptions'
=> ''.&mt('Default set of options to pass to tth/m when converting tex').' '
);
my @Display_Order = ('url','description','courseid','cloners','grading',
+ 'externalsyllabus',
'default_xml_style','pageseparators',
'question.email','comment.email','policy.email',
'student_classlist_view',
@@ -1817,10 +2226,11 @@ sub crsenv {
'default_enrollment_start_date',
'default_enrollment_end_date',
'tthoptions',
- 'disablesigfigs'
+ 'disablesigfigs',
+ 'disableexampointprint'
);
foreach my $parameter (sort(keys(%values))) {
- unless ($parameter =~ m/^internal\./) {
+ unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./)) {
if (! $descriptions{$parameter}) {
$descriptions{$parameter}=$parameter;
push(@Display_Order,$parameter);
@@ -2059,15 +2469,41 @@ sub listdata {
my $pointer=0;
$tableopen=0;
my $foundkeys=0;
+ my %keyorder=&standardkeyorder();
foreach my $thiskey (sort {
if ($sortorder eq 'realmstudent') {
- my ($astudent,$arealm)=($a=~/^$env{'request.course.id'}\.([^\.]+)\.(.+)\.[^\.]+$/);
- my ($bstudent,$brealm)=($b=~/^$env{'request.course.id'}\.([^\.]+)\.(.+)\.[^\.]+$/);
- ($arealm cmp $brealm) || ($astudent cmp $bstudent);
+ 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);
+ }
} else {
$a cmp $b;
}
} keys %{$listdata}) {
+
if ($$listdata{$thiskey.'.type'}) {
my $thistype=$$listdata{$thiskey.'.type'};
if ($$resourcedata{$thiskey.'.type'}) {
@@ -2123,6 +2559,15 @@ sub listdata {
$oldpart=$part;
}
#
+# Preset defaults?
+#
+ my ($hour,$min,$sec,$val)=('','','','');
+ unless ($$resourcedata{$thiskey}) {
+ my ($parmname)=($thiskey=~/\.(\w+)$/);
+ ($hour,$min,$sec,$val)=&preset_defaults($parmname);
+ }
+
+#
# Ready to print
#
$r->print(&tablestart().''.$name.
@@ -2133,14 +2578,41 @@ sub listdata {
my $jskey='key_'.$pointer;
$pointer++;
$r->print(
- &Apache::lonhtmlcommon::date_setter('overviewform',
+ &Apache::lonhtmlcommon::date_setter('parmform',
$jskey,
- $$resourcedata{$thiskey}).
-' '
+ $$resourcedata{$thiskey},
+ '',1,'','',$hour,$min,$sec).
+' '.
+&date_sanity_info($$resourcedata{$thiskey})
);
+ } elsif ($thistype eq 'string_yesno') {
+ my $showval;
+ if (defined($$resourcedata{$thiskey})) {
+ $showval=$$resourcedata{$thiskey};
+ } else {
+ $showval=$val;
+ }
+ $r->print(' print(' checked="checked"');
+ }
+ $r->print(' />'.&mt('Yes').' ');
+ $r->print(' print(' checked="checked"');
+ }
+ $r->print(' />'.&mt('No').' ');
} else {
+ my $showval;
+ if (defined($$resourcedata{$thiskey})) {
+ $showval=$$resourcedata{$thiskey};
+ } else {
+ $showval=$val;
+ }
$r->print(' ');
+ $showval.'">');
}
$r->print(' ');
@@ -2185,6 +2657,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'};
@@ -2199,6 +2672,8 @@ ENDOVER
@selected_sections = ('all');
}
}
+ my @selected_groups =
+ &Apache::loncommon::get_env_multiple('form.Group');
my $pssymb='';
my $parmlev='';
@@ -2226,11 +2701,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'};
@@ -2245,37 +2724,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'})) {
@@ -2295,6 +2745,41 @@ ENDOVER
'