--- loncom/interface/lonparmset.pm 2018/09/03 20:23:37 1.522.2.24
+++ loncom/interface/lonparmset.pm 2016/07/12 20:30:20 1.560
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
-# $Id: lonparmset.pm,v 1.522.2.24 2018/09/03 20:23:37 raeburn Exp $
+# $Id: lonparmset.pm,v 1.560 2016/07/12 20:30:20 damieng Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,7 +36,11 @@ lonparmset - Handler to set parameters f
=head1 SYNOPSIS
-lonparmset provides an interface to setting course parameters.
+lonparmset provides an interface to setting course parameters.
+
+It contains all the code for the "Content and Problem Settings" UI, except
+for the helpers parameter.helper and resettimes.helper, and lonhelper.pm,
+and lonblockingmenu.pm.
=head1 DESCRIPTION
@@ -54,21 +58,25 @@ 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 14 possible levels
+Returns: A list, the first item is the index into the remaining list of items of parm values that is the active one, the list consists of parm values at the 18 possible levels
-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
+18 - General Course
+17 - Map or Folder level in course (recursive)
+16 - Map or Folder level in course (non-recursive)
+15 - resource default
+14 - map default
+13 - resource level in course
+12 - General for section
+11 - Map or Folder level for section (recursive)
+10 - Map or Folder level for section (non-recursive)
+9 - resource level in section
+8 - General for group
+7 - Map or Folder level for group (recursive)
+6 - Map or Folder level for group (non-recursive)
+5 - resource level in group
+4 - General for specific student
+3 - Map or Folder level for specific student (recursive)
+2 - Map or Folder level for specific student (non-recursive)
1 - resource level for specific student
=item parmval_by_symb()
@@ -149,7 +157,7 @@ Input: See list below
=back
-Outputs: See list below
+Outputs: See list below:
=over 4
@@ -323,6 +331,42 @@ use HTML::Entities;
use LONCAPA qw(:DEFAULT :match);
+##################################################
+# CONTENT AND PROBLEM SETTINGS HTML PAGE HEADER/FOOTER
+##################################################
+
+# Page header
+sub startSettingsScreen {
+ my ($r,$mode,$crstype)=@_;
+
+ my $tabtext = &mt('Course Settings');
+ if ($crstype eq 'Community') {
+ $tabtext = &mt('Community Settings');
+ }
+ $r->print("\n".'
');
+}
+
+
+
+##################################################
+# TABLE MODE
+# (parmval is also used for the log of parameter changes)
+##################################################
+
sub parmval {
my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec,
@@ -344,84 +388,106 @@ sub parmval_by_symb {
$map = &Apache::lonnet::deversion($map);
my $symbparm=$symb.'.'.$what;
+ my $recurseparm=$map.'___(rec).'.$what;
my $mapparm=$map.'___(all).'.$what;
my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$what;
my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
+ my $grpleveli=$env{'request.course.id'}.'.['.$cgroup.'].'.$recurseparm;
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 $secleveli=$env{'request.course.id'}.'.['.$csec.'].'.$recurseparm;
my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
my $courselevel=$env{'request.course.id'}.'.'.$what;
my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
+ my $courseleveli=$env{'request.course.id'}.'.'.$recurseparm;
my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
# --------------------------------------------------------- first, check course
if (defined($$courseopt{$courselevel})) {
- $outpar[14]=$$courseopt{$courselevel};
- $result=14;
+ $outpar[18]=$$courseopt{$courselevel};
+ $result=18;
+ }
+
+ if (defined($$courseopt{$courseleveli})) {
+ $outpar[17]=$$courseopt{$courseleveli};
+ $result=17;
}
if (defined($$courseopt{$courselevelm})) {
- $outpar[13]=$$courseopt{$courselevelm};
- $result=13;
+ $outpar[16]=$$courseopt{$courselevelm};
+ $result=16;
}
# ------------------------------------------------------- second, check default
- if (defined($def)) { $outpar[12]=$def; $result=12; }
+ if (defined($def)) { $outpar[15]=$def; $result=15; }
# ------------------------------------------------------ third, check map parms
+
my $thisparm=&parmhash($symbparm);
- if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; }
+ if (defined($thisparm)) { $outpar[14]=$thisparm; $result=14; }
if (defined($$courseopt{$courselevelr})) {
- $outpar[10]=$$courseopt{$courselevelr};
- $result=10;
+ $outpar[13]=$$courseopt{$courselevelr};
+ $result=13;
}
# ------------------------------------------------------ fourth, back to course
if ($csec ne '') {
if (defined($$courseopt{$seclevel})) {
- $outpar[9]=$$courseopt{$seclevel};
- $result=9;
- }
+ $outpar[12]=$$courseopt{$seclevel};
+ $result=12;
+ }
+ if (defined($$courseopt{$secleveli})) {
+ $outpar[11]=$$courseopt{$secleveli};
+ $result=11;
+ }
if (defined($$courseopt{$seclevelm})) {
- $outpar[8]=$$courseopt{$seclevelm};
- $result=8;
- }
-
+ $outpar[10]=$$courseopt{$seclevelm};
+ $result=10;
+ }
if (defined($$courseopt{$seclevelr})) {
- $outpar[7]=$$courseopt{$seclevelr};
- $result=7;
- }
+ $outpar[9]=$$courseopt{$seclevelr};
+ $result=9;
+ }
}
# ------------------------------------------------------ fifth, check course group
if ($cgroup ne '') {
if (defined($$courseopt{$grplevel})) {
- $outpar[6]=$$courseopt{$grplevel};
- $result=6;
+ $outpar[8]=$$courseopt{$grplevel};
+ $result=8;
+ }
+ if (defined($$courseopt{$grpleveli})) {
+ $outpar[7]=$$courseopt{$grpleveli};
+ $result=7;
}
if (defined($$courseopt{$grplevelm})) {
- $outpar[5]=$$courseopt{$grplevelm};
- $result=5;
+ $outpar[6]=$$courseopt{$grplevelm};
+ $result=6;
}
if (defined($$courseopt{$grplevelr})) {
- $outpar[4]=$$courseopt{$grplevelr};
- $result=4;
+ $outpar[5]=$$courseopt{$grplevelr};
+ $result=5;
}
}
-# ---------------------------------------------------------- fifth, check user
+# ---------------------------------------------------------- sixth, check user
if ($uname ne '') {
if (defined($$useropt{$courselevel})) {
- $outpar[3]=$$useropt{$courselevel};
+ $outpar[4]=$$useropt{$courselevel};
+ $result=4;
+ }
+
+ if (defined($$useropt{$courseleveli})) {
+ $outpar[3]=$$useropt{$courseleveli};
$result=3;
}
@@ -453,74 +519,74 @@ sub reset_caches {
my $parmhashid;
my %parmhash;
sub resetparmhash {
- undef($parmhashid);
- undef(%parmhash);
+ undef($parmhashid);
+ undef(%parmhash);
}
sub cacheparmhash {
- if ($parmhashid eq $env{'request.course.fn'}) { return; }
- my %parmhashfile;
- if (tie(%parmhashfile,'GDBM_File',
- $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {
- %parmhash=%parmhashfile;
- untie(%parmhashfile);
- $parmhashid=$env{'request.course.fn'};
- }
+ if ($parmhashid eq $env{'request.course.fn'}) { return; }
+ my %parmhashfile;
+ if (tie(%parmhashfile,'GDBM_File',
+ $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {
+ %parmhash=%parmhashfile;
+ untie(%parmhashfile);
+ $parmhashid=$env{'request.course.fn'};
+ }
}
sub parmhash {
- my ($id) = @_;
- &cacheparmhash();
- return $parmhash{$id};
+ my ($id) = @_;
+ &cacheparmhash();
+ return $parmhash{$id};
}
- }
+}
{
my $symbsid;
my %symbs;
sub resetsymbcache {
- undef($symbsid);
- undef(%symbs);
+ undef($symbsid);
+ undef(%symbs);
}
sub symbcache {
- my $id=shift;
- if ($symbsid ne $env{'request.course.id'}) {
- undef(%symbs);
- }
- if (!$symbs{$id}) {
- my $navmap = Apache::lonnavmaps::navmap->new();
- if ($id=~/\./) {
- my $resource=$navmap->getById($id);
- $symbs{$id}=$resource->symb();
- } else {
- my $resource=$navmap->getByMapPc($id);
- $symbs{$id}=&Apache::lonnet::declutter($resource->src());
+ my $id=shift;
+ if ($symbsid ne $env{'request.course.id'}) {
+ undef(%symbs);
+ }
+ if (!$symbs{$id}) {
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ if ($id=~/\./) {
+ my $resource=$navmap->getById($id);
+ $symbs{$id}=$resource->symb();
+ } else {
+ my $resource=$navmap->getByMapPc($id);
+ $symbs{$id}=&Apache::lonnet::declutter($resource->src());
+ }
+ $symbsid=$env{'request.course.id'};
}
- $symbsid=$env{'request.course.id'};
- }
- return $symbs{$id};
+ return $symbs{$id};
}
- }
+}
{
my $rulesid;
my %rules;
sub resetrulescache {
- undef($rulesid);
- undef(%rules);
+ undef($rulesid);
+ undef(%rules);
}
sub rulescache {
- my $id=shift;
- if ($rulesid ne $env{'request.course.id'}
- && !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};
+ my $id=shift;
+ if ($rulesid ne $env{'request.course.id'}
+ && !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};
}
}
@@ -529,14 +595,14 @@ sub reset_caches {
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'));
+ # yes, there is something
+ return (&rulescache($type.'_hours'),
+ &rulescache($type.'_min'),
+ &rulescache($type.'_sec'),
+ &rulescache($type.'_value'));
} else {
-# nothing there or something else
- return ('','','','','');
+ # nothing there or something else
+ return ('','','','','');
}
}
@@ -600,50 +666,51 @@ 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;
+ # first time call
+ %recstack=();
+ $recflag=1;
}
-# store parameter
+ # store parameter
&storeparm_by_symb_inner
($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup);
-# don't do anything if parameter was reset
+ # don't do anything if parameter was reset
unless ($nval) { return; }
my ($prefix,$parm)=($spnam=~/^(.*[\_\.])([^\_\.]+)$/);
-# remember that this was set
+ # remember that this was set
$recstack{$parm}=1;
-# what does this trigger?
+ # 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);
- }
- }
+ # 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 '';
}
@@ -661,30 +728,37 @@ sub storeparm_by_symb_inner {
$map = &Apache::lonnet::deversion($map);
my $symbparm=$symb.'.'.$spnam;
+ my $recurseparm=$map.'___(rec).'.$spnam;
my $mapparm=$map.'___(all).'.$spnam;
my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$spnam;
my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
+ my $grpleveli=$env{'request.course.id'}.'.['.$cgroup.'].'.$recurseparm;
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 $secleveli=$env{'request.course.id'}.'.['.$csec.'].'.$recurseparm;
my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
my $courselevel=$env{'request.course.id'}.'.'.$spnam;
my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
+ my $courseleveli=$env{'request.course.id'}.'.'.$recurseparm;
my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
my $storeunder='';
- 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; }
+ if (($snum==18) || ($snum==4)) { $storeunder=$courselevel; }
+ if (($snum==17) || ($snum==3)) { $storeunder=$courseleveli; }
+ if (($snum==16) || ($snum==2)) { $storeunder=$courselevelm; }
+ if (($snum==13) || ($snum==1)) { $storeunder=$courselevelr; }
+ if ($snum==12) { $storeunder=$seclevel; }
+ if ($snum==11) { $storeunder=$secleveli; }
+ if ($snum==10) { $storeunder=$seclevelm; }
+ if ($snum==9) { $storeunder=$seclevelr; }
+ if ($snum==8) { $storeunder=$grplevel; }
+ if ($snum==7) { $storeunder=$grpleveli; }
+ if ($snum==6) { $storeunder=$grplevelm; }
+ if ($snum==5) { $storeunder=$grplevelr; }
my $delete;
@@ -692,67 +766,68 @@ sub storeparm_by_symb_inner {
my %storecontent = ($storeunder => $nval,
$storeunder.'.type' => $ntype);
my $reply='';
- if ($snum>3) {
+
+ if ($snum>4) {
# ---------------------------------------------------------------- Store Course
#
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
-# Expire sheets
- &Apache::lonnet::expirespread('','','studentcalc');
- if (($snum==10) || ($snum==7) || ($snum==4)) {
- &Apache::lonnet::expirespread('','','assesscalc',$symb);
- } elsif (($snum==11) || ($snum==8) || ($snum==5)) {
- &Apache::lonnet::expirespread('','','assesscalc',$map);
- } else {
- &Apache::lonnet::expirespread('','','assesscalc');
- }
-# Store parameter
- if ($delete) {
- $reply=&Apache::lonnet::del
- ('resourcedata',[keys(%storecontent)],$cdom,$cnum);
- &log_parmset(\%storecontent,1);
- } else {
- $reply=&Apache::lonnet::cput
- ('resourcedata',\%storecontent,$cdom,$cnum);
- &log_parmset(\%storecontent);
- }
- &Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ # Expire sheets
+ &Apache::lonnet::expirespread('','','studentcalc');
+ if (($snum==13) || ($snum==9) || ($snum==5)) {
+ &Apache::lonnet::expirespread('','','assesscalc',$symb);
+ } elsif (($snum==14) || ($snum==10) || ($snum==6)) {
+ &Apache::lonnet::expirespread('','','assesscalc',$map);
+ } else {
+ &Apache::lonnet::expirespread('','','assesscalc');
+ }
+ # Store parameter
+ if ($delete) {
+ $reply=&Apache::lonnet::del
+ ('resourcedata',[keys(%storecontent)],$cdom,$cnum);
+ &log_parmset(\%storecontent,1);
+ } else {
+ $reply=&Apache::lonnet::cput
+ ('resourcedata',\%storecontent,$cdom,$cnum);
+ &log_parmset(\%storecontent);
+ }
+ &Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
} else {
# ------------------------------------------------------------------ Store User
#
-# Expire sheets
- &Apache::lonnet::expirespread($uname,$udom,'studentcalc');
- if ($snum==1) {
- &Apache::lonnet::expirespread
- ($uname,$udom,'assesscalc',$symb);
- } elsif ($snum==2) {
- &Apache::lonnet::expirespread
- ($uname,$udom,'assesscalc',$map);
- } else {
- &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
- }
-# Store parameter
- if ($delete) {
- $reply=&Apache::lonnet::del
- ('resourcedata',[keys(%storecontent)],$udom,$uname);
- &log_parmset(\%storecontent,1,$uname,$udom);
- } else {
- $reply=&Apache::lonnet::cput
- ('resourcedata',\%storecontent,$udom,$uname);
- &log_parmset(\%storecontent,0,$uname,$udom);
- }
- &Apache::lonnet::devalidateuserresdata($uname,$udom);
+ # Expire sheets
+ &Apache::lonnet::expirespread($uname,$udom,'studentcalc');
+ if ($snum==1) {
+ &Apache::lonnet::expirespread
+ ($uname,$udom,'assesscalc',$symb);
+ } elsif ($snum==2) {
+ &Apache::lonnet::expirespread
+ ($uname,$udom,'assesscalc',$map);
+ } else {
+ &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
+ }
+ # Store parameter
+ if ($delete) {
+ $reply=&Apache::lonnet::del
+ ('resourcedata',[keys(%storecontent)],$udom,$uname);
+ &log_parmset(\%storecontent,1,$uname,$udom);
+ } else {
+ $reply=&Apache::lonnet::cput
+ ('resourcedata',\%storecontent,$udom,$uname);
+ &log_parmset(\%storecontent,0,$uname,$udom);
+ }
+ &Apache::lonnet::devalidateuserresdata($uname,$udom);
}
if ($reply=~/^error\:(.*)/) {
- return "Write Error: $1";
+ return "Write Error: $1";
}
return '';
}
sub valout {
- my ($value,$type,$editable)=@_;
+ my ($value,$type,$name,$editable)=@_;
my $result = '';
# Values of zero are valid.
if (! $value && $value ne '0') {
@@ -766,7 +841,17 @@ sub valout {
}
} else {
if ($type eq 'date_interval') {
- my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
+ my ($totalsecs,$donesuffix) = split(/_/,$value,2);
+ my ($usesdone,$donebuttontext,$proctor,$secretkey);
+ if ($donesuffix =~ /^done\:([^\:]+)\:(.*)$/) {
+ $donebuttontext = $1;
+ (undef,$proctor,$secretkey) = split(/_/,$2);
+ $usesdone = 'done';
+ } elsif ($donesuffix =~ /^done(|_.+)$/) {
+ $donebuttontext = &mt('Done');
+ ($usesdone,$proctor,$secretkey) = split(/_/,$donesuffix);
+ }
+ my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($totalsecs);
my @timer;
$year=$year-70;
$mday--;
@@ -799,13 +884,20 @@ sub valout {
push(@timer,&mt('[quant,_1,sec]',0));
}
$result.=join(", ",@timer);
+ if ($usesdone eq 'done') {
+ if ($secretkey) {
+ $result .= ' '.&mt('+ "[_1]" with proctor key: [_2]',$donebuttontext,$secretkey);
+ } else {
+ $result .= ' + "'.$donebuttontext.'"';
+ }
+ }
} elsif (&isdateparm($type)) {
$result = &Apache::lonlocal::locallocaltime($value).
- &date_sanity_info($value);
+ &date_sanity_info($value);
} else {
$result = $value;
$result=~s/\,/\, /gs;
- $result = &HTML::Entities::encode($result,'"<>&');
+ $result = &HTML::Entities::encode($result,'"<>&');
}
}
return $result;
@@ -816,7 +908,7 @@ sub plink {
my ($type,$dis,$value,$marker,$return,$call)=@_;
my $winvalue=$value;
unless ($winvalue) {
- if (&isdateparm($type)) {
+ if (&isdateparm($type)) {
$winvalue=$env{'form.recent_'.$type};
} else {
$winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
@@ -825,12 +917,12 @@ sub plink {
my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);
my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
unless (defined($winvalue)) { $winvalue=$val; }
- my $valout = &valout($value,$type,1);
+ my $valout = &valout($value,$type,$parmname,1);
my $unencmarker = $marker;
foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,
\$hour, \$min, \$sec) {
- $$item = &HTML::Entities::encode($$item,'"<>&');
- $$item =~ s/\'/\\\'/g;
+ $$item = &HTML::Entities::encode($$item,'"<>&');
+ $$item =~ s/\'/\\\'/g;
}
return '
'.
'
+
$selscript
ENDJS
@@ -905,8 +999,189 @@ function showHide_courseContent() {
COURSECONTENTSCRIPT
}
+sub toggleparmtextbox_js {
+ return <<"ENDSCRIPT";
+
+if (!document.getElementsByClassName) {
+ function getElementsByClassName(node, classname) {
+ var a = [];
+ var re = new RegExp('(^| )'+classname+'( |$)');
+ var els = node.getElementsByTagName("*");
+ for(var i=0,j=els.length; i$remove');
+ });
+
+ \$(wrapper).delegate(".LC_remove_ipacc","click", function(e){
+ e.preventDefault(); \$(this).closest("div").remove();
+ })
+});
+
+
+END
+}
+
+sub done_proctor_js {
+ return <<"END";
+function toggleSecret(form,radio,key) {
+ var radios = form[radio+key];
+ if (radios.length) {
+ for (var i=0; i "group_or_section('cgroup')",
@@ -915,14 +1190,14 @@ sub startpage {
$loaditems{'onload'} = "showHide_courseContent(); group_or_section('cgroup'); resize_scrollbox('mapmenuscroll','1','1');";
}
- if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
- && (!$env{'form.dis'})) || ($env{'form.symb'})) {
- &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters',
- text=>"Problem Parameters"});
+ if ((($env{'form.command'} eq 'set') && ($env{'form.url'}) &&
+ (!$env{'form.dis'})) || ($env{'form.symb'})) {
+ &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters',
+ text=>"Problem Parameters"});
} else {
- &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
- text=>"Table Mode",
- help => 'Course_Setting_Parameters'});
+ &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
+ text=>"Table Mode",
+ help => 'Course_Setting_Parameters'});
}
my $js = &page_js().'
';
my $start_page =
- &Apache::loncommon::start_page('Set/Modify Course Parameters',$js,
- {'add_entries' => \%loaditems,});
+ &Apache::loncommon::start_page('Set/Modify Course Parameters',$js,
+ {'add_entries' => \%loaditems,});
my $breadcrumbs =
&Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode');
my $escfilter=&Apache::lonhtmlcommon::entity_encode($env{'form.filter'});
my $escpart=&Apache::lonhtmlcommon::entity_encode($env{'form.part'});
$r->print($start_page.$breadcrumbs);
+ &startSettingsScreen($r,'parmset',$crstype);
$r->print(<
@@ -954,26 +1230,26 @@ ENDHEAD
sub print_row {
my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
- $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp,
- $readonly)=@_;
+ $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp)=@_;
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
+
+ # 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,$cgroup,$courseopt);
-# get the type for the parameters
-# problem: these may not be set for all levels
+ # 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,$cgroup,$courseopt);
-# cascade down manually
+ # cascade down manually
my $cascadetype=$$defaulttype{$which};
- for (my $i=14;$i>0;$i--) {
- if ($typeoutpar[$i]) {
+ for (my $i=18;$i>0;$i--) {
+ if ($typeoutpar[$i]) {
$cascadetype=$typeoutpar[$i];
- } else {
+ } else {
$typeoutpar[$i]=$cascadetype;
}
}
@@ -987,37 +1263,39 @@ sub print_row {
}
my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');
if ($automatic) {
- $parm.=' '.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'';
+ $parm.=' '.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'';
}
$r->print('
');
@@ -1082,33 +1365,29 @@ sub print_row {
}
sub print_td {
- my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp,$readonly)=@_;
+ my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp)=@_;
$r->print('
'.$output);
+ $shown++;
+ }
+ if (!($env{'form.show'} eq &mt('all')
+ || $shown<=$env{'form.show'})) { last; }
}
$r->print(&Apache::loncommon::end_data_table());
+ &endSettingsScreen($r);
$r->print(&Apache::loncommon::end_page());
}
+##################################################
+# MISC !
+##################################################
+
+# Used by table UI
sub update_slots {
my ($slot_name,$cdom,$cnum,$symb,$uname,$udom) = @_;
my %slot=&Apache::lonnet::get_slot($slot_name);
@@ -4827,14 +5637,15 @@ sub update_slots {
context => 'parameter',
);
&Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
- '',$uname,$udom,$cnum,$cdom);
+ '',$uname,$udom,$cnum,$cdom);
&Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
- '',$uname,$udom,$uname,$udom);
+ '',$uname,$udom,$uname,$udom);
}
return $success;
}
+# Used by table UI
sub delete_slots {
my ($slot_name,$cdom,$cnum,$uname,$udom,$symb) = @_;
my $delresult;
@@ -4861,15 +5672,16 @@ sub delete_slots {
context => 'parameter',
);
&Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
- 1,$uname,$udom,$cnum,$cdom);
+ 1,$uname,$udom,$cnum,$cdom);
&Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
- 1,$uname,$udom,$uname,$udom);
+ 1,$uname,$udom,$uname,$udom);
}
}
}
return $delresult;
}
+# Used by handler
sub check_for_course_info {
my $navmap = Apache::lonnavmaps::navmap->new();
return 1 if ($navmap);
@@ -4886,105 +5698,45 @@ sub parameter_release_vars {
}
sub parameter_releasecheck {
- my ($name,$value,$needsrelease,$cmajor,$cminor) = @_;
+ my ($name,$value,$valmatch,$namematch,$needsrelease,$cmajor,$cminor) = @_;
my $needsnewer;
my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
if (($cmajor < $needsmajor) ||
($cmajor == $needsmajor && $cminor < $needsminor)) {
$needsnewer = 1;
- } else {
- &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value});
+ } elsif ($name) {
+ if ($valmatch) {
+ &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.'::'.$valmatch.':'});
+ } elsif ($value) {
+ &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value.'::'});
+ }
+ } elsif ($namematch) {
+ &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter::::'.$namematch});
}
return $needsnewer;
}
-sub oldversion_warning {
- my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;
- my $desc;
- my %stringtypes = (
- type => 'string_questiontype',
- lenient => 'string_lenient',
- retrypartial => 'string_yesno',
- discussvote => 'string_discussvote',
- examcode => 'string_examcode',
- );
- if (exists($stringtypes{$name})) {
- if ($name eq 'examcode') {
- $desc = $value;
- } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') {
- foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) {
- next unless (ref($possibilities) eq 'ARRAY');
- my ($parmval, $description) = @{ $possibilities };
- if ($parmval eq $value) {
- $desc = $description;
- last;
- }
- }
- }
- } elsif (($name eq 'printstartdate') || ($name eq 'printenddate')) {
- my $now = time;
- if ($value =~ /^\d+$/) {
- if ($name eq 'printstartdate') {
- if ($value > $now) {
- $desc = &Apache::lonlocal::locallocaltime($value);
- }
- } elsif ($name eq 'printenddate') {
- if ($value < $now) {
- $desc = &Apache::lonlocal::locallocaltime($value);
- }
- }
- }
- }
- my $standard_name = &standard_parameter_names($name);
- return '
'.
- &mt('[_1] was [_2]not[_3] set to [_4].',
- $standard_name,'','','"'.$desc.'"').' '.
- &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',
- $cmajor.'.'.$cminor,$chostname,
- $needsrelease).
- '
';
-}
-
-sub get_permission {
- my %permission;
- my $allowed = 0;
- return (\%permission,$allowed) unless ($env{'request.course.id'});
- if ((&Apache::lonnet::allowed('opa',$env{'request.course.id'})) ||
- (&Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
- $env{'request.course.sec'}))) {
- %permission= (
- 'edit' => 1,
- 'set' => 1,
- 'setoverview' => 1,
- 'addmetadata' => 1,
- 'ordermetadata' => 1,
- 'setrestrictmeta' => 1,
- 'newoverview' => 1,
- 'setdefaults' => 1,
- 'settable' => 1,
- 'parameterchangelog' => 1,
- 'cleanparameters' => 1,
- 'dateshift1' => 1,
- 'dateshift2' => 1,
- 'helper' => 1,
- );
- } elsif ((&Apache::lonnet::allowed('vpa',$env{'request.course.id'})) ||
- (&Apache::lonnet::allowed('vpa',$env{'request.course.id'}.'/'.
- $env{'request.course.sec'}))) {
- %permission = (
- 'set' => 1,
- 'settable' => 1,
- 'newoverview' => 1,
- 'setoverview' => 1,
- 'parameterchangelog' => 1,
- );
- }
- foreach my $perm (values(%permission)) {
- if ($perm) { $allowed=1; last; }
- }
- return (\%permission,$allowed);
-}
+##################################################
+# HANDLER
+##################################################
+# Main handler for lonparmset.
+# Sub called based on request parameters action and command:
+# no command or action: print_main_menu
+# command 'set': assessparms (direct access to table mode for a resource)
+# (this can also be accessed simply with the symb parameter)
+# action 'setoverview': overview (display all existing parameter settings)
+# action 'addmetadata': addmetafield (called to add a portfolio metadata field)
+# action 'ordermetadata': order_meta_fields (called to order portfolio metadata fields)
+# action 'setrestrictmeta': setrestrictmeta (display or save portfolio metadata)
+# action 'newoverview': newoverview (overview mode)
+# action 'setdefaults': defaultsetter (UI to change parameter setting default actions)
+# action 'settable': assessparms (table mode)
+# action 'parameterchangelog': parm_change_log (display log for parameter changes,
+# blog postings, user notification changes)
+# action 'cleanparameters': clean_parameters (unused)
+# action 'dateshift1': date_shift_one (overview mode, shift all dates)
+# action 'dateshift2': date_shift_two (overview mode, shift all dates)
sub handler {
my $r=shift;
@@ -5012,25 +5764,25 @@ sub handler {
'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});
# ----------------------------------------------------- Needs to be in a course
- my ($parm_permission,$allowed) = &get_permission();
+ my $parm_permission =
+ (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
+ &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
+ $env{'request.course.sec'}));
my $exists = &check_for_course_info();
- if ($env{'request.course.id'} && $allowed && $exists) {
+ if ($env{'request.course.id'} && $parm_permission && $exists) {
#
# Main switch on form.action and form.state, as appropriate
#
# Check first if coming from someone else headed directly for
# the table mode
- if (($parm_permission->{'set'}) &&
- ((($env{'form.command'} eq 'set') && ($env{'form.url'})
- && (!$env{'form.dis'})) || ($env{'form.symb'}))) {
- &assessparms($r,$parm_permission);
+ if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
+ && (!$env{'form.dis'})) || ($env{'form.symb'})) {
+ &assessparms($r);
} elsif (! exists($env{'form.action'})) {
&print_main_menu($r,$parm_permission);
- } elsif (!$parm_permission->{$env{'form.action'}}) {
- &print_main_menu($r,$parm_permission);
} elsif ($env{'form.action'} eq 'setoverview') {
- &overview($r,$parm_permission);
+ &overview($r);
} elsif ($env{'form.action'} eq 'addmetadata') {
&addmetafield($r);
} elsif ($env{'form.action'} eq 'ordermetadata') {
@@ -5038,13 +5790,13 @@ sub handler {
} elsif ($env{'form.action'} eq 'setrestrictmeta') {
&setrestrictmeta($r);
} elsif ($env{'form.action'} eq 'newoverview') {
- &newoverview($r,$parm_permission);
+ &newoverview($r);
} elsif ($env{'form.action'} eq 'setdefaults') {
&defaultsetter($r);
} elsif ($env{'form.action'} eq 'settable') {
- &assessparms($r,$parm_permission);
+ &assessparms($r);
} elsif ($env{'form.action'} eq 'parameterchangelog') {
- &parm_change_log($r,$parm_permission);
+ &parm_change_log($r);
} elsif ($env{'form.action'} eq 'cleanparameters') {
&clean_parameters($r);
} elsif ($env{'form.action'} eq 'dateshift1') {
@@ -5054,14 +5806,14 @@ sub handler {
}
} else {
# ----------------------------- Not in a course, or not allowed to modify parms
- if ($exists) {
- $env{'user.error.msg'}=
- "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
- } else {
- $env{'user.error.msg'}=
- "/adm/parmset::0:1:Course environment gone, reinitialize the course";
- }
- return HTTP_NOT_ACCEPTABLE;
+ if ($exists) {
+ $env{'user.error.msg'}=
+ "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
+ } else {
+ $env{'user.error.msg'}=
+ "/adm/parmset::0:1:Course environment gone, reinitialize the course";
+ }
+ return HTTP_NOT_ACCEPTABLE;
}
&reset_caches();